2014-02-08 24 views
1

我想运行管的东西有许多标志,以fgrep命令:fgrep一样含有串旗

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

要做到这一点,我想创建一个包含标志和串事先的字符串。基本上,我试图做到这一点:

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

但我收到以下错误:

​​

肯定是有办法通过这种方式fgrep一样做到这一点(使用“fgrep一样$ { = STR}“)。它是什么?

+1

你为什么做'$ {= STR}'?为什么不只是'$ {STR}'? – larsks

+1

根据下面的评论,它看起来像唯一的问题是,你正在试图用_wrong shell_运行你的 - valid - 'zsh'代码。请确认。 – mklement0

+0

是的,这是问题所在。非常感谢! – user1145925

回答

2

更新

的OP显然使用zsh,但加了标签的问题仅统称为shell(暗示POSIX兼容性)。

什么可能发生的情况是,他/她尝试运行使用不同外壳上面zsh特异性代码,导致bad substitution错误 - bash会给该错误,例如。

zsh运行,上面的代码不工作 - 它使用zsh的字符串分割标志=$STR内容分解成单个的单词 - 但它并不能概括得好:如果搜索字符串嵌入了 例如,空间解决方案会中断。

下面是一个更强大的解决方案zsh,以及工作在bash,加上POSIX兼容的外壳的解决方案。


假设你正在使用bash的的zsh

使用阵列建立你的参数列表,然后传递整个数组双引号来fgrep

STR=('-e' 'hi') 
STR+=('-e' 'bye') 
printf 'nihibyehi\nhello\nhi\n' | fgrep "${STR[@]}" 

对于POSIX兼容的外壳(如果使用bashzsh是不是一种选择),您可以编写搜索字符串的(临时)文件,并使用-f选项将它传递给fgrep

echo 'hi' > STRs.txt 
echo 'bye' >> STRs.txt 
printf 'nihibyehi\nhello\nhi\n' | fgrep -f STRs.txt 
+0

DATE =“ - e .2013-03-26。-e .2013-03-27。”;用于$(ls | fgrep $ {= DATE})中的文件;做; echo $ {file};完成; – user1145925

+2

@ user1145925:如果这对您有用,您可能会使用'zsh',并且应该以这种方式标记您的问题。 Unix环境中的'shell'意味着一个POSIX兼容的shell,但是你使用的功能 - 分裂标志'=' - 不是。(在附注中,你不应该用'for'来解析命令输出 - use IFS =''读取-r ...'而不是)。 – mklement0