Sedの変数の中に二重引用符があります。

Sedの変数の中に二重引用符があります。

修正する

@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すべての行が印刷、変更、または行われません。

関連情報