次の行を含むbashスクリプトでsedを使用して、テキストファイルの値を変更しようとしています。
sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp
これはforループになります。なぜ機能しないのか分かりません。助言がありますか?
'
内の変数は、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
さらに読む:
単一引用符内の変数は展開されません。二重引用符内では、この場合は二重引用符を使用します。
sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
eval
で動作させることもできますが、絶対にしないでください!!
sed "s/draw($prev_number;n_)/draw($number;n_)/g"
これは機能しますか?
以下のような変数を使用できます。ここのように、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