在多行搜索模式?

时间:2013-12-02 15:05:02

标签: regex bash shell unix grep

我正在尝试在任何行上找到3个单词的模式,其中包含任何内容。目前,我正在以这种方式使用pcregrep(-M用于多行):

sep=$( echo ".*\n.*" )

find . -name "$FILE" 2>null | xargs pcregrep -M "string1($sep)string2($sep)string3" >> $grep_out

我得到了这个结果:

./testing/test.txt:   let prep = "select string1, dog from cat",
              " where string2 = 1",
              " and string3 = ?",

哪个好。但是,我希望这种模式能够在几个换行符中找到这3个字符串 - 而不仅仅是连续的。例如,我希望找到这个结果:

./testing/test.txt:   let prep = "select string1, dog from cat",
              " where apple = 1",
              " and string2 = 2",
              " and grass = 8",
              " and string3 = ?",

我的模式现在与上述结果不匹配是有道理的,因为它只是寻找一个换行符。所以,我认为将代码改为这样可以解决这个问题(更改$ sep变量并在搜索模式中添加星号):

sep=$( echo ".|\n" )

find . -name "$FILE" 2>null | xargs pcregrep -M "string1($sep)*string2($sep)*string3" >> $grep_out

但是现在没有结果。将星号放在括号内也不会产生任何结果。所以我仍然在寻找一种模式,它允许在我的3个字符串之间包含0个或更多个字符,包括换行符。

1 个答案:

答案 0 :(得分:2)

find . -name "$FILE" 2>/dev/null -execdir \
sh -c "grep -aA999999 string1 '"{}"' | grep -aA999999 string2 | grep -q string3" \
';' -print

仅限于string1,string2和string3之间的999999行。

请勿在{{1​​}}之后添加空格。