fgrep带有包含标志的字符串



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

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

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

STR="-e hi"
STR="${STR} -e bye"
echo "nihibyehinhellonhi" | fgrep ${=STR}

但是我收到以下错误:

${=STR}: bad substitution

肯定有一种以这种方式通过FGREP执行此操作的方法(使用" fgrep $ {= str}")。是什么?

update

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

可能发生的事情是他/她试图使用不同的 shell来运行上述zsh特定代码,导致bad substitution错误-bash会出现该错误。

使用zsh运行时,上述代码确实可以工作 - 它使用zsh的字符串拆分标志=$STR的内容分解为单个单词 - 但它并不能很好地推广:例如,如果搜索字符串嵌入了空间,则解决方案将破裂。

下面是更强大的解决方案zshbash中起作用,以及用于Posix兼容的外壳的解决方案。


假设您正在使用 bash zsh

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

STR=('-e' 'hi')
STR+=('-e' 'bye')
printf 'nihibyehinhellonhin' | fgrep "${STR[@]}"

对于 POSIX兼容Shells (如果使用bashzsh不是选项),您可以将搜索字符串写入(临时)文件并使用-f选项将其传递给fgrep

echo 'hi' > STRs.txt
echo 'bye' >> STRs.txt
printf 'nihibyehinhellonhin' | fgrep -f STRs.txt

相关内容

  • 没有找到相关文章