bash変数に格納されている文字列を置き換えるには、sedを呼び出します。

bash変数に格納されている文字列を置き換えるには、sedを呼び出します。

bashsedまたはを使用して変数を拡張したいと思います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" が生成されます。

注:配列の文字列にスペースや「/ $ |」が含まれていないことを確認してください。試す方法によって異なる解決策がある場合は、邪魔になる可能性があります。

関連情報