如何根据连续两行的内容来 grep 目录?

如何根据连续两行的内容来 grep 目录?

我怎样才能 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 字符)而不是换行符结尾。
  • -PPerl 正则表达式语法

编辑:此版本打印出整个匹配行

    grep -o -P -z  '(.*)Foo(.*)\n(.*)Bar(.*)' file

相关内容