如何为grep中的新行提供模式?

tux*_*ani 71 bash grep newline

如何为grep中的新行提供模式?新行开始,新行结束.不是正则表达方式.像\n.

nul*_*ion 78

尝试pcregrep而不是常规grep:

pcregrep -M "pattern1.*\n.*pattern2" filename
Run Code Online (Sandbox Code Playgroud)

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


ara*_*rdi 72

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

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

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 
Run Code Online (Sandbox Code Playgroud)

  • 至少 GNU grep 有 -z 选项,可以使 grep 以空字符换行。但是,它似乎不支持换行符或 \n 模式来匹配换行符,请参阅[错误报告](https://bugs.launchpad.net/ubuntu/+source/grep/+bug/1641092)。 (5认同)
  • @jarno 它支持带有 -P 标志的模式中的 \n (2认同)

小智 18

你可以用这种方式......

grep -P '^\s$' file
Run Code Online (Sandbox Code Playgroud)
  • -P用于Perl正则表达式(POSIX的扩展grep).
  • \s匹配空白字符; 如果跟着*,它也匹配一个空行.
  • ^匹配行的开头.$匹配行的结尾.

  • `-P`是GNU扩展.当情况需要它时(通常是lookahead/lookbehind),我可以使用它,但是POSIX grep可以使用`[[:space:]]`来执行此操作. (2认同)

rub*_*ion 15

由于@jarno我知道-z选项,我发现使用GNU的grep时-P选项,对匹配\n是可能的.:)

例:

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

打印 bar

  • 这很棒!非常感谢你的分享! (2认同)

ken*_*orb 6

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

grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
Run Code Online (Sandbox Code Playgroud)

基本上,它在寻找精确匹配_foo_,其中_手段\n(所以__= \n\n).您无需将其翻译回来tr '_' '\n',因为无论如何每个模式都会打印在新行中,因此删除_就足够了.


小智 6

刚刚发现

grep $'\r'
Run Code Online (Sandbox Code Playgroud)

它用于$'\r'Bash 中的 c 风格转义。

本文中