我想用许多标志运行管道到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
的内容分解为单个单词 - 但它并不能很好地推广:例如,如果搜索字符串嵌入了空间,则解决方案将破裂。
下面是更强大的解决方案在zsh
和bash
中起作用,以及用于Posix兼容的外壳的解决方案。
假设您正在使用 bash 或 zsh :
使用数组来构建您的参数列表,然后将整个数组双引号传递给fgrep
:
STR=('-e' 'hi')
STR+=('-e' 'bye')
printf 'nihibyehinhellonhin' | fgrep "${STR[@]}"
对于 POSIX兼容Shells (如果使用bash
或zsh
不是选项),您可以将搜索字符串写入(临时)文件并使用-f
选项将其传递给fgrep
:
echo 'hi' > STRs.txt
echo 'bye' >> STRs.txt
printf 'nihibyehinhellonhin' | fgrep -f STRs.txt