Jak podać wzór nowej linii w grep? Nowa linia na początku, nowa linia na końcu. Nie sposób wyrażeń regularnych. Coś w rodzaju \ n.
$. Jest nieco ograniczona, ale nadaje się do użytku w prostych przypadkach.
Jak podać wzór nowej linii w grep? Nowa linia na początku, nowa linia na końcu. Nie sposób wyrażeń regularnych. Coś w rodzaju \ n.
$. Jest nieco ograniczona, ale nadaje się do użytku w prostych przypadkach.
Odpowiedzi:
grep wzorce są dopasowywane do poszczególnych wierszy, więc nie ma możliwości dopasowania wzorca do nowej linii znalezionej w danych wejściowych.
Możesz jednak znaleźć puste wiersze w ten sposób:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
spróbuj pcregrepzamiast zwykłego grep:
pcregrep -M "pattern1.*\n.*pattern2" filename
ta -Mopcja umożliwia dopasowanie w wielu wierszach, więc możesz wyszukiwać nowe wiersze jako \n.
Dzięki @jarno wiem o opcji -z i dowiedziałem się, że używając GNU grep z opcją -P, dopasowanie do \njest możliwe . :)
Przykład:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Wydruki bar
grep -zoPnir "dex\n035" ./dir/
Możesz użyć w ten sposób ...
grep -P '^\s$' file
-Pjest używany dla wyrażeń regularnych Perla (rozszerzenie POSIX grep).\sdopasuj białe znaki; jeśli występuje po nim *, dopasowuje również pusty wiersz.^dopasowuje początek wiersza. $dopasowuje koniec linii. -Pjest rozszerzeniem GNU. Mogę go używać, gdy sytuacja tego wymaga (zwykle lookahead / lookbehind), ale POSIX grep może to zrobić tylko z plikiem [[:space:]].
-P. GNU i tak jest dość standardowe. :)
brew install grepzdobyć GNU grep, który jest lepszy pod wieloma względami. apple.stackexchange.com/questions/193288/…
Jeśli chodzi o obejście problemu (bez używania nieprzenośnego -P), możesz tymczasowo zastąpić znak nowego wiersza innym i zmienić go z powrotem, np:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
Zasadniczo szuka dokładnego dopasowania, _foo_gdzie _oznacza \n(więc __= \n\n). Nie musisz go tłumaczyć z powrotem tr '_' '\n', ponieważ każdy wzór i tak zostałby wydrukowany w nowej linii, więc _wystarczy usunąć .
<(p paste -sd_ file )?
new line at the beginningjest pustą linią inew line at endma zastosowanie do każdej linii w pliku. Czy możesz zamieścić przykład?