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

时间:2012-09-29 12:06:50

标签: bash grep newline

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

之类的东西

6 个答案:

答案 0 :(得分:74)

尝试pcregrep而非常规grep

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

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

答案 1 :(得分:67)

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

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

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

答案 2 :(得分:18)

你可以这样使用......

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

答案 3 :(得分:8)

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

示例:

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

打印bar

答案 4 :(得分:6)

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

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

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

答案 5 :(得分:1)

刚刚发现

grep $'\r'

它正在$'\r'中使用Bash中的c样式转义。

this article