我怎样才能 grep a目录对于包含“Foo”的行,但是仅有的当下一行也包含“Bar”时获得匹配吗?
答案1
@warl0ck 为我指明了正确的方向pcregrep
,但我说的是“包含”,而不是“是”,并且我询问的是目录,而不是文件。
这似乎对我有用。
pcregrep -rMi 'Foo(.*)\n(.*)Bar' .
答案2
grep 本身似乎不支持,使用 pcregrep 代替:
Foo
Bar
Foo
abc
pcregrep -M "Foo\nBar" file
得到:
Foo
Bar
答案3
用sed
脚本:
#!/bin/sed -nf
/^Foo/{
h # put the matching line in the hold buffer
n # going to nextline
/^Bar/{ # matching pattern in newline
H # add the line to the hold buffer
x # return the entire paragraph into the pattern space
p # print the pattern space
q # quit the script now
}
}
使用它:
chmod +x script.sed
printf '%s\n' * | ./script.sed
这里printf
每行显示当前目录中的所有文件,并将其传递给sed
.
笔记: 这是按字母顺序排序的。
pattern space
更多有用和的信息hold space
这里。
格莱莫尔网站有关于shell
编程的非常好的东西。
答案4
虽然我更喜欢使用 Nathan 的解决方案pcregrep
,但这里是仅使用 grep 的解决方案
grep -o -z -P 'Foo(.*)\n(.*)Bar' file
选项说明:
-o
只打印匹配的部分。必要的,因为包含-z
将打印整个文件(除非某处有 \0)-z
将输入视为一组行,每行以零字节(ASCII NUL 字符)而不是换行符结尾。-P
Perl 正则表达式语法
编辑:此版本打印出整个匹配行
grep -o -P -z '(.*)Foo(.*)\n(.*)Bar(.*)' file