如何在 grep 中给出新行的模式?

如何在 grep 中给出新行的模式? 新行在开始,新行在结束。不是正则表达式的方式。有点像 n。

223819 次浏览

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

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

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces

你可以用这种方式..。

grep -P '^\s$' file
  • -P is used for Perl regular expressions (an extension to POSIX grep).
  • \s匹配空白字符; 如果后跟 *,它也匹配空行。
  • ^匹配行首。 $匹配行尾。

试试 pcregrep而不是常规的 grep:

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

-M选项允许它跨多行进行匹配,因此您可以将换行作为 \n进行搜索。

至于变通方法(不使用不可移植的 -P) ,您可以用不同的字符临时替换一个新行字符并将其更改回来,例如:

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

基本上它在寻找完全匹配的 _foo_,其中 _意味着 \n(所以 __ = \n\n)。你不必把它翻译回来的 tr '_' '\n',因为每个模式将打印在新的一行无论如何,所以删除 _就足够了。

Thanks to @jarno I know about the -z option and I found out that when using GNU grep with the -P option, \n匹配是可能的. :)

例如:

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

Result:

bar

包括匹配所有内容(包括换行符)的示例:

.*不匹配换行。要匹配包括换行在内的所有内容,使用 1 (.|\n)*:

grep -zoP 'foo\n\K(.|\n)*'<<<$'foo\nbar\nqux'

Result:

bar
qux

点击此处查看: http://stackoverflow/a/33418344 https://stackoverflow.com/a/33418344

刚找到

grep $'\r'

它在 Bash 中使用 $'\r'进行 c 式转义。

in 这篇文章