bash
sed
またはを使用して変数を拡張したいと思いますawk
。変数は配列です。
たとえば、スクリプトは配列に含まれる文字列を削除する必要があります。頑張った
ARRAY1=(
string1
string2
string3
)
sed -i '/${ARRAY1[@]}/d' /etc/file
そして
ARRAY1=(
string1
string2
string3
)
for i in ${ARRAY1[@]} ;do sed -i '/$i/d' /etc/file;done
しかし、それらのどれも機能せず、sed
変数を拡張しません。
どうすればいいですか?
答え1
そしてzsh
:
array1=(
string1
string2
string3
)
sed -i -e/$^array1/d file
の正規表現に一致するすべての行が削除されます$array1
。
または、次のようにすることができます(Bourneに似たシェル)。
regexps='string1
string2
string3'
grep -ve "$regexps" file
または文字列を検索するには、以下を追加します-F
。
grep -F -v -e$^array1 # (zsh)
または:
strings='string1
string2
string3'
grep -F -ve "$strings" # (any shell)
答え2
解決策を見つけて""
代わりに使用してください''
。
答え3
私はsedを使用しませんが、egrep -i -vを使用します(-iは大文字と小文字を区別しません。-vはパターンと一致しません)。
egrep -i -v "$(echo ${ARRAY1[@]} | tr ' ' '|')" /etc/file
表現方式
echo ${ARRAY1[@]}
引用符がないため、新しい行は印刷されず、配列内のすべての文字列を含むスペースで区切られた文字列が生成されます。
tr ' ' '|'
grep式の場合、すべてのスペース(または)を\ |に置き換えると、grepコマンドのパターンが構築されます。
これでsedの使用に固執する場合は、いくつかのオプションがあり、そのうちの1つは次のとおりです。
sed -i $(echo ${ARRAY1[@]} | sed -e 's:\w\+:-e "/\1/d":g') /etc/file
これにより、個別の sed 基本 sed コマンド -e "/stringFromArray/d" が生成されます。
注:配列の文字列にスペースや「/ $ |」が含まれていないことを確認してください。試す方法によって異なる解決策がある場合は、邪魔になる可能性があります。