web-dev-qa-db-ja.com

bash変数によるsed置換

次の行を含むbashスクリプトでsedを使用して、テキストファイルの値を変更しようとしています。

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp

これはforループになります。なぜ機能しないのか分かりません。助言がありますか?

49
csta

'内の変数は、bashで置換されません。文字列の置換(またはPerlに精通している場合は補間)を取得するには、単一引用符の代わりに二重引用符"を使用するように変更する必要があります。

$ # enclose entire expression in double quotes
$ sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

$ # or, concatenate strings with only variables inside double quotes
$ # this would restrict expansion to relevant portion
$ # and prevent accidental expansion for !, backticks, etc
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp

$ # variable cannot contain arbitrary characters
$ # see link in further reading section for details
$ a='foo 
bar'
$ echo 'baz' | sed 's/baz/'"$a"'/g'
sed: -e expression #1, char 9: unterminated `s' command


さらに読む:

65
k.parnell

単一引用符内の変数は展開されません。二重引用符内では、この場合は二重引用符を使用します。

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

evalで動作させることもできますが、絶対にしないでください!!

13
Paul Creasey
sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

これは機能しますか?

5
Kent

以下のような変数を使用できます。ここのように、hostname、つまりファイル内のシステム変数を置き換えたいと思いました。文字列look.meを探し、その行全体をlook.me=<system_name>に置き換えています

sed -i "s/.*look.me.*/look.me=`hostname`/"

システム値を他の変数に保存し、その変数を置換に使用することもできます。

Host_var=`ホスト名 `

sed -i "s/.*look.me.*/look.me=$Host_var/"


入力ファイル :

look.me=demonic

ファイルの出力(システム名がprod-cfm-frontend-1-usa-central-1であると仮定):

look.me=prod-cfm-frontend-1-usa-central-1
1
daemonsl