Próbuję użyć grep do wyodrębnienia atrybutów z dużej kolekcji plików XML. Próbowałem użyć grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml || printf "NULL"
ale z jakiegoś powodu nie zwraca NULL dla pliku, jeśli wyrażenie regularne się nie zgadza. Końcowa gra polega na zbudowaniu podstawowej bazy danych SQL tych plików, wykorzystując informacje ze znaczników do wypełnienia kolumn. To jest mój pierwszy atak na DB, więc może wszystko pójdzie źle?
1
||
dotyczy całegogrep
polecenie, więcprintf
zostanie wykonane tylko, jeśligrep
zwraca wartość niezerową, którą zrobi tylko wtedy, gdy Nie dopasowania plików.Odpowiedzi:
Jeśli chcesz coś na plik, musisz użyć
grep
na plik, coś w stylu:Rozbijam to:
To generuje listę plików do przeszukania i umieszcza je w
while
. Jedyne, co musi zrobić, to wydrukować jedną ścieżkę na linię, więc jest wiele sposobów, aby to zrobić.Odczytuje każdą linię do
path
zmienna powłoki i pętle doread
zwracafalse
, co robi, gdy osiągnie koniec pliku, co robi, gdyfind
wygenerował wszystkie ścieżki, do których chce dotrzeć.Przeszukuje bieżący plik (w
$path
). Jeśli wzorca nie ma w pliku,grep
zwracafalse
(tzn. wychodzi z niezerowym kodem wyjścia), więcecho
jest wykonywany. The-e
mówi, aby interpretować ucieczki, więcecho
wydrukuje bieżącą ścieżkę, ASCIInul
i dosłownyNULL
. To naśladowaćgrep
wyjście, które będzie bieżącą ścieżką (wymuszone przez-H
, byciegrep
normalnie nie wyprowadzałby ścieżki podczas przeszukiwania pojedynczego pliku), ASCIInul
(z powodu-Z
) i dopasowany tekst.Zamyka
while
pętla.źródło
Spróbuj tego:
źródło
-Z
mówi, aby zastąpić go ASCIInul
.