grep - 多行模式写作

grep - 多行模式写作

如何grepbash脚本内多行编写模式?像那样:

grep -o -P '
    (?!<.*?(?<!(href))=")
        https?:\/\/(?!(www\.example\.com)).*?
    (?=(">))
' input.txt

当我写php程序时,我可以这样做。现在在 bash 脚本中尝试了这个 - 它不起作用。将所有内容写在一行中非常不方便:(

可能是存在选项,它允许在模式内部进行格式化,也就是说,grep启用此选项时不会注意到空格(空格和换行符)。

grep 版本:

grep -V
grep (GNU grep) 2.25

答案1

即使-P使用它,(?x:)您也不能忽略换行符。对于空格和制表符,它的工作原理是:

echo abab | grep -P $'(?x:a b a\tb)'

但换行符的工作方式不同:

echo ab | grep -P $'(?x:a\nb)'
grep: the -P option only supports a single pattern

至少在 GNU grep 2.16 中是这样。

答案2

grep使用换行符来分隔不同的模式。但是您可以将模式保存在变量中,然后在将其传递给之前删除空格grep

$ ws=$' \t\n'
$ pat=$'a b\nc'
$ echo abcd | grep "${pat//[$'\n\t ']}"
abcd

(没有测试更复杂的东西。)

相关内容