是否可以在多行上编写 grep 语句?

Sum*_*mak 8 grep

我想通过每行编写 1 个模式来提高脚本的可读性。

是否有一种语法可以让我转换grep 'foo\|bar\|barz'为以下内容?

grep 'foo\|
      bar\|
      barz'
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 12

模式参数实际上是一个模式列表,由换行符分隔。这甚至适用于grep -F:您可以搜索多个字符串。所以你可以写:

grep 'foo
bar
barz'
Run Code Online (Sandbox Code Playgroud)

但请注意,连续行不能缩进:任何前导空格都将成为模式的一部分。出于这个原因,您可能更喜欢将模式列表作为单独的参数传递,并-e在每个模式的前面。然后,您可以\在行尾使用命令参数之间的行拆分 shellgrep命令。这两种语法是等价的。

grep -e 'foo' \
     -e 'bar' \
     -e 'barz'
Run Code Online (Sandbox Code Playgroud)

请注意,grep当传递-P选项(用于 PCRE 正则表达式)时,这些选项都不适用于当前版本的 GNU ,在这些情况下,该选项会以grep: the -P option only supports a single pattern. 但是,您可以使用pcregrep代替 GNUgrep -P并使用该x标志来输入多行正则表达式:

pcregrep '(?x)
  foo |
  bar |
  barz'
Run Code Online (Sandbox Code Playgroud)

使用(?x),包括 SPC 和 NL 在内的所有空白字符都将被忽略,允许您根据需要缩进代码。


mur*_*uru 11

我认为没有必要在|那里。您可以使用-e跨行分布的多个选项:

grep -e foo \
     -e bar \
     -e barz
Run Code Online (Sandbox Code Playgroud)