Как указать шаблон для новой строки в grep? Новая строка в начале, новая строка в конце. Не способ регулярного выражения. Что-то вроде \н.
Как указать шаблон для новой строки в grep?
Ответы (6)
grep
шаблоны сопоставляются с отдельными строками, поэтому шаблон не может соответствовать новой строке, найденной во входных данных.
Однако вы можете найти пустые строки, например:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
попробуйте pcregrep
вместо обычного grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
опция -M
позволяет сопоставлять несколько строк, поэтому вы можете искать новые строки как \n
.
Благодаря @jarno я знаю об опции -z и обнаружил, что при использовании GNU grep с опцией -P возможно сопоставление с \n
. :)
Пример:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Отпечатки bar
grep -zoPnir "dex\n035" ./dir/
- person galian; 18.12.2020
Вы можете использовать этот способ...
grep -P '^\s$' file
-P
используется для регулярных выражений Perl (расширение POSIXgrep
).\s
соответствуют пробельным символам; если за ним следует*
, он также соответствует пустой строке.^
соответствует началу строки.$
соответствует концу строки.
-P
— это расширение GNU. Я могу использовать его, когда этого требует ситуация (обычно с опережением/просмотром назад), но POSIX grep может сделать это, просто файл с [[:space:]]
.
- person jordanm; 30.09.2012
-P
. В любом случае GNU довольно стандартен. :)
- person K3---rnc; 24.06.2013
brew install grep
получить GNU grep, который лучше по нескольким параметрам. apple.stackexchange.com/questions/193288/
- person herdrick; 12.05.2018
Что касается обходного пути (без использования непереносимого -P
), вы можете временно заменить символ новой строки на другой и изменить его обратно, например:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
По сути, он ищет точное совпадение _foo_
, где _
означает \n
(так что __
= \n\n
). Вам не нужно переводить его обратно на tr '_' '\n'
, так как каждый шаблон все равно будет печататься в новой строке, поэтому достаточно удалить _
.
<(p paste -sd_ file )
?
- person humanityANDpeace; 06.09.2018
только что нашел
grep $'\r'
Он использует $'\r'
для выхода в стиле c в Bash.
new line at the beginning
— это пустая строка, аnew line at end
применяется к каждой строке в файле. Можете ли вы опубликовать пример? - person P.P   schedule 29.09.2012$
. Это несколько ограничено, но может использоваться в простых случаях. - person Krzysztof Jabłoński   schedule 13.02.2014