如何给grep中的换行模式?


95

如何给grep中的换行模式?新行开始,新行结束。不是正则表达式的方式。类似于\ n。


6
不清楚你想要什么。new line at the beginning是空白行,new line at end适用于文件中的每一行。你能举个例子吗?
PP

2
实际上,您可以使用$。它有一定的局限性,但在简单情况下可用。
2014年

Answers:


84

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

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

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

至少GNU grep具有-z选项,该选项使grep换行符为空字符。但是,它似乎不支持换行符或\ n模式以匹配换行符,请参见错误报告
jarno

1
@jarno它支持带-P标志的\ n模式
rubystallion

92

尝试pcregrep代替常规grep

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

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


22

您可以使用这种方式...

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

2
-P是GNU扩展。我可以在情况需要时使用它(通常是向前/向后),但是POSIX grep可以使用来完成此操作[[:space:]]
jordanm 2012年

1
FWIW,Solaris和BSD的grep联机帮助页(未检查其他内容)都有的段落-P。无论如何,GNU是非常标准的。:)
K3 --- rnc 2013年

1
从手册页:[-P] FreeBSD不支持该选项。
玛丽安CERNY

对于MacOsX,也没有[-P]:grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C [num]] [-e模式] [-f文件] [--binary-files = value] [--color [= when]] [--color [= when]] [--context [= num]] [--label] [-行缓冲] [--null] [pattern] [file。 ..]
尼可罗马基

@Niccolò您将要brew install grep获得GNU grep,它在几种方面都比较出色。 apple.stackexchange.com/questions/193288/…–
Herdrick

19

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

例:

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

版画 bar


1
很好,请注意,我在回答中没有收到有关“ @jarno”的通知。
jarno

3
这很棒!非常感谢你的分享!
艾莉西亚·唐

6

至于解决方法(不使用non-portable -P),您可以将换行符临时替换为另一个换行符,然后将其改回,例如:

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

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


请原谅我的无知,但是使用过程替代功能还不是另一个NON posix兼容的产品,因此是不可移植的功能吗?在posix shell中我做不到<(p paste -sd_ file )
humanityANDpeace

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.