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 pcregrep
zamiast zwykłego grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
ta -M
opcja 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 \n
jest 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
-P
jest używany dla wyrażeń regularnych Perla (rozszerzenie POSIX grep
).\s
dopasuj białe znaki; jeśli występuje po nim *
, dopasowuje również pusty wiersz.^
dopasowuje początek wiersza. $
dopasowuje koniec linii. -P
jest 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 grep
zdobyć 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 beginning
jest pustą linią inew line at end
ma zastosowanie do każdej linii w pliku. Czy możesz zamieścić przykład?