带有包含标志的字符串的fgrep

时间:2014-02-08 04:06:41

标签: bash unix grep arguments zsh

我想用很多标志运行管道到fgrep:

echo "hi" | fgrep -e hi -e bye -e don ...

为此,我想预先创建包含标志和字符串的字符串。基本上,我试图这样做:

STR="-e hi"
STR="${STR} -e bye"
echo "nihibyehi\nhello\nhi" | fgrep ${=STR}

但是我收到以下错误:

${=STR}: bad substitution

有一种方法可以通过fgrep以这种方式完成此操作(使用“fgrep $ {= STR}”)。它是什么?

1 个答案:

答案 0 :(得分:2)

<强>更新

OP显然使用zsh,但仅将问题标记为shell(建议POSIX兼容性)。

可能发生的事情是他/她尝试使用不同的 shell运行上述zsh特定代码,导致bad substitution错误 - {{1}例如,会给出错误。

使用bash运行时,上述代码可以正常工作 - 它使用zsh的字符串拆分标记zsh=的内容分解为单个字词 - 但它没有很好地概括: 例如,如果搜索字符串有嵌入空格,解决方案就会中断。

以下是更强大的解决方案,适用于$STR以及zsh,以及POSIX兼容shell的解决方案。


假设您使用 bash zsh

使用数组构建参数列表,然后将整个数组双引号传递给bash

fgrep

对于与POSIX兼容的shell (如果使用STR=('-e' 'hi') STR+=('-e' 'bye') printf 'nihibyehi\nhello\nhi\n' | fgrep "${STR[@]}" bash不是一个选项),您可以将搜索字符串写入(临时)文件并使用zsh选项将其传递给-f

fgrep