Bash スクリプトの SED: Bash スクリプトの変数から取得した特殊文字でテキストを置き換える方法

Bash スクリプトの SED: Bash スクリプトの変数から取得した特殊文字でテキストを置き換える方法

まず、bash スクリプトには特殊文字を含む変数があります。次に例を示します。list.txt :

user = root
password = 1234

Bash スクリプト:

#!/bin/sh
var1 = var&2018+&
find . -name "list.txt" -exec sed -i "s/1234/"$var1"/g" {} +

スクリプトを実行すると、結果は var12342018+1234 になります。

アップデート 1 (Oliv による回答):

var1='var&2018+&'
find . -name "*list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;

結果は同じです: パスワード = var12342018+1234

誰か助けてくれるかもしれない。ありがとう

答え1

まず、var1変数を引用符で囲む必要があります。

パスワードを変数として指定するには、コマンドbash -cで次のように使用できます。find

 var1='var\&2018+\&'
 find . -name "list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;

答え2

&正規表現の一致全体を表す特殊文字であることを知っておくと、問題を理解するのに役立つかもしれません。

が見つかったので1234、それを に置き換えておりvar12342018+1234、2 つ&が一致した文字列になります。

私が言いたいもう1つの点は、本当に個人的な好みですが、find ... -execwith を使用する場合{}、この構文は好きではないので、通常は次のように終了します。\;

私はxargsを使うのが好きです

find . -name list.txt | xargs sed -i 's/1234/var&2018+&/g'

末尾の g は、見つかった回数だけ置き換えられることに注意してください...

また、これは明らかかもしれません。サブツリーにファイルがいくつあるかはわかりませんlist.txtが、1 つしかない場合は、 は必要ありませんfind

sed -i 's/pattern/replacement/options' filename

関連情報