2016-03-25 16 views
0

が、私は次の文字列を含む変数を持っていると言うことができます(空白スペースで区切らなく、エコーとき、それはラインのように見える):文字列内の特定の行を削除しますか?シェル

animal:whale 
animal:dog 
animal:2_mice 
animal:cat 

そして私は、私はから削除する動物の名前を含む別の変数を持っていますスペースで区切られた最初の文字列。

は、私が最初の文字列から猫や犬を含む行を削除するに行くかどうnames="cat dog"

を言うことができますか?

私はsedとgrepのアプローチを調べてみましたが、それまでにはうまくいきませんでした。

また、式が正確に一致する必要があることを指摘しておきます.2番目の変数がcatではなくcaを含む場合、catは削除されません。

grepの逆検索を使用して
+0

は、カンマ区切りまたはスペース区切りのはずの名前ですか? – Alec

+0

スペース。 names変数の内容には、空白で区切られた複数の動物の名前を含めることができます。 – Daeto

+1

変数の正確な値は?あなたは 'printf"%q \ n "" $ var "'の出力を表示できます – anubhava

答えて

1
echo "$variable" | grep -Ev ":($(echo "$names" | sed 's/ /|/g'))$" 
+1

'echo $ variable'は改行を破棄します(スペースで置き換えます)。 –

+0

これはトリックを行ったようです! :)私は、改行のことは本当に重要ではないと思うが、できるだけ普遍的な解決策を望むので、-Pが問題になるかもしれない。 – Daeto

+1

移植性のために-Eに切り替えられ、〜から行末まで完全にマッチングするためのサポートが追加されました。 – Alec

0

は、名前の変数に値を前提とした空間分離し、1ワードずつさ:

$ echo "$var" 
animal:whale 
animal:dog 
animal:2_mice 
animal:cat 

$ echo "$names" 
cat dog 

$ echo "$var" | grep -v $(printf ' -e :%s$' $names) 
animal:whale 
animal:2_mice 
関連する問題