Как указать шаблон для новой строки в grep?

Как указать шаблон для новой строки в grep? Новая строка в начале, новая строка в конце. Не способ регулярного выражения. Что-то вроде \н.


person tuxnani    schedule 29.09.2012    source источник
comment
Не понятно чего ты хочешь. new line at the beginning — это пустая строка, а new line at end применяется к каждой строке в файле. Можете ли вы опубликовать пример?   -  person P.P    schedule 29.09.2012
comment
На самом деле вы можете просто использовать $. Это несколько ограничено, но может использоваться в простых случаях.   -  person Krzysztof Jabłoński    schedule 13.02.2014
comment
gnu.org/software/grep/manual/grep.html#Usage см. пункт 15.   -  person jarno    schedule 12.11.2016


Ответы (6)


grep шаблоны сопоставляются с отдельными строками, поэтому шаблон не может соответствовать новой строке, найденной во входных данных.

Однако вы можете найти пустые строки, например:

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 
person arash kordi    schedule 29.09.2012
comment
По крайней мере, в GNU grep есть опция -z, которая разрывает строки grep нулевым символом. Однако похоже, что он не поддерживает новую строку или \n в шаблоне для соответствия новой строке, см. отчет об ошибке. - person jarno; 12.11.2016
comment
@jarno Поддерживает \n в шаблонах с флагом -P - person rubystallion; 09.03.2018

попробуйте pcregrep вместо обычного grep:

pcregrep -M "pattern1.*\n.*pattern2" filename

опция -M позволяет сопоставлять несколько строк, поэтому вы можете искать новые строки как \n.

person nullrevolution    schedule 01.10.2012

Благодаря @jarno я знаю об опции -z и обнаружил, что при использовании GNU grep с опцией -P возможно сопоставление с \n. :)

Пример:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

Отпечатки bar

person rubystallion    schedule 09.03.2018
comment
Отлично, обратите внимание, что я не получаю уведомления о @jarno в ответе. - person jarno; 13.03.2018
comment
Это здорово! Большое спасибо, что поделились! - person Alicia Tang; 06.04.2018
comment
Работает на меня. Большое спасибо. grep -zoPnir "dex\n035" ./dir/ - person galian; 18.12.2020

Вы можете использовать этот способ...

grep -P '^\s$' file
  • -P используется для регулярных выражений Perl (расширение POSIX grep).
  • \s соответствуют пробельным символам; если за ним следует *, он также соответствует пустой строке.
  • ^ соответствует началу строки. $ соответствует концу строки.
person Manikandan Rajendran    schedule 29.09.2012
comment
-P — это расширение GNU. Я могу использовать его, когда этого требует ситуация (обычно с опережением/просмотром назад), но POSIX grep может сделать это, просто файл с [[:space:]]. - person jordanm; 30.09.2012
comment
FWIW, справочные страницы Solaris и BSD grep (другие не проверял) имеют абзац для -P. В любом случае GNU довольно стандартен. :) - person K3---rnc; 24.06.2013
comment
Со страницы руководства: [-P] Эта опция не поддерживается в FreeBSD. - person Marián Černý; 04.12.2014
comment
Нет [-P] для MacOsX: grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A число] [-B число] [-C[число]] [-e шаблон] [-f файл] [--binary-files=значение] [--color[=when]] [--color[=when]] [--context[=num]] [--label] [--line-buffered] [--null] [шаблон] [file . ..] - person Niccolò; 12.01.2017
comment
@Niccolò Вы захотите 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', так как каждый шаблон все равно будет печататься в новой строке, поэтому достаточно удалить _.

person kenorb    schedule 18.10.2015
comment
извините за мое невежество, но использование замены процесса не является еще одной несовместимой с posix, следовательно, непереносимой функцией? в оболочке posix я не мог сделать <(p paste -sd_ file )? - person humanityANDpeace; 06.09.2018

только что нашел

grep $'\r'

Он использует $'\r' для выхода в стиле c в Bash.

в этой статье

person HHHartmann    schedule 29.12.2018