2014-02-08 23 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