111

如何在 grep 中为新行提供模式?开头换行,结尾换行。不是正则表达式的方式。像\n这样的东西。

4

6 回答 6

102

尝试pcregrep代替常规grep

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

-M选项允许它匹配多行,因此您可以搜索换行符为\n.

于 2012-10-01T17:46:57.000 回答
95

grep模式与单个行匹配,因此模式无法匹配输入中找到的换行符。

但是你可以找到像这样的空行:

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 
于 2012-09-29T12:23:53.050 回答
28

感谢@jarno,我知道 -z 选项,并且我发现当使用带有 -P 选项的 GNU grep 时,匹配\n是可能的。:)

例子:

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

印刷bar

于 2018-03-09T11:10:50.590 回答
24

你可以用这种方式...

grep -P '^\s$' file
  • -P用于 Perl 正则表达式(对 POSIX 的扩展grep)。
  • \s匹配空白字符;如果后跟*,它也匹配一个空行。
  • ^匹配行的开头。$匹配行尾。
于 2012-09-29T12:30:32.097 回答
6

至于解决方法(不使用 non-portable -P),您可以临时用不同的换行符替换换行符并将其改回,例如:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_'

基本上它正在寻找完全匹配的_foo_意思_\nso __= \n\n)。您不必将其翻译回来tr '_' '\n',因为无论如何每个模式都会打印在新行中,因此删除_就足够了。

于 2015-10-18T12:04:28.923 回答
4

刚刚发现

grep $'\r'

$'\r'用于 Bash 中的 c 样式转义。

这篇文章中

于 2018-12-29T10:21:21.850 回答