如何grep
在bash
脚本内多行编写模式?像那样:
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
(没有测试更复杂的东西。)