修正する
@steeldriver 回答ありがとうございます。問題は、二重引用符のみ/
を置き換える必要があるということではありません。|
現在私のコマンドにはいくつかの問題がありますsed
。ファイル内の文字列を置き換えようとしていますが、問題は代替項目に二重引用符が含まれていることです。
変数にはファイルの値が含まれます。変数textには対応する値があります。
<string name="app_mod_app_crowdin_1">crowdin one es</string>
問題は、コマンドを実行するときです。sed
sed -i .bak -e "Ns/.*/$text/" results.txt
間違い
sed: 1: "1s/.*/<string name="app ...": bad flag in substitute command: 's'
答え1
foo='"hello world"'
echo $foo
"hello world"
echo '"hello world"' | sed 's/'"$foo"'/bye hell/'
bye hell
答え2
sed
ユーザーが提供したデータをスクリプトに挿入しないでください。これは貴重な問題よりも大きな問題であり、多くの場合、セキュリティ抜け穴になる可能性があります(特にsed
任意のコード実行を許可するGNUの場合)。挿入されたコマンド$text
の置き換え部分は、s///
実際にはsed
任意の文字列でスクリプトを変更することに注意してください$text
。
最初の行だけを固定文字列に変更する必要がある場合は、代わりに次を使用してくださいawk
。
cp results.txt results.txt.bak &&
awk -v value="$text" 'NR == 1 { $0 = value }; 1' results.txt.bak >results.txt
テスト:
$ text='<string name="app_mod_app_crowdin_1">crowdin one es</string>'
$ cat results.txt
line 1
line 2
line 3
$ cp results.txt results.txt.bak && awk -v value="$text" 'NR == 1 { $0 = value }; 1' results.txt.bak >results.txt
$ cat results.txt
<string name="app_mod_app_crowdin_1">crowdin one es</string>
line 2
line 3
このawk
コードは単に現在の行を与えられたテキストに置き換えます。 if NR == 1
、つまりこれがファイルの最初の行である場合。後続により、1
すべての行が印刷、変更、または行われません。