【发布时间】:2012-09-21 01:55:05
【问题描述】:
如何在 grep 中为新行指定模式? 开头换行,结尾换行。不是正则表达式的方式。类似\n。
【问题讨论】:
-
不清楚你想要什么。
new line at the beginning是一个空行,new line at end适用于文件中的每一行。可以举个例子吗? -
其实你可以用
$。它有些有限,但在简单的情况下可用。
如何在 grep 中为新行指定模式? 开头换行,结尾换行。不是正则表达式的方式。类似\n。
【问题讨论】:
new line at the beginning 是一个空行,new line at end 适用于文件中的每一行。可以举个例子吗?
$。它有些有限,但在简单的情况下可用。
grep 模式与单个行匹配,因此模式无法匹配输入中找到的换行符。
但是你可以找到像这样的空行:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
【讨论】:
你可以这样用……
grep -P '^\s$' file
-P 用于 Perl 正则表达式(POSIX grep 的扩展)。\s 匹配空白字符;如果后跟*,它也匹配一个空行。^ 匹配行首。 $ 匹配行尾。 【讨论】:
-P 是一个 GNU 扩展。当情况需要时我可以使用它(通常是前瞻/后视),但 POSIX grep 只需使用 [[:space:]] 归档即可。
-P。无论如何,GNU 是相当标准的。 :)
brew install grep 来获得 GNU grep,它在几个方面都非常出色。 apple.stackexchange.com/questions/193288/…
尝试使用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',因为无论如何每个模式都会打印在新行中,因此删除 _ 就足够了。
【讨论】:
<(p paste -sd_ file )?
感谢@jarno,我知道了 -z 选项,并且发现当使用带有 -P 选项的 GNU grep 时,可以匹配 \n。 :)
示例:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
打印bar
【讨论】:
grep -zoPnir "dex\n035" ./dir/
【讨论】: