sed置換でLHSとRHSで変数を使用するには?

sed置換でLHSとRHSで変数を使用するには?

私がしたい:

cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh

私のプログラムで。

しかし、次のような変数を使用したいと思います。

old_run='old_name_952'
new_run='old_name_953'

試してみましたが、交換は発生しません(エラーなし)。私は試した:

cat update_via_sed.sh | sed 's/old_run/new_run/'
cat update_via_sed.sh | sed 's/$old_run/$new_run/'
cat update_via_sed.sh | sed 's/${old_run}/${new_run}/'

答え1

次のことができます。

sed "s/$old_run/$new_run/" < infile > outfile

ただし、これは$old_run正規表現として扱われるため、変数に含まれる特殊文字(/または)は次のようになり.ます。脱出する。同様に、$new_runおよび&文字は特別な処理を必要とし、その中の改行文字を\エスケープする必要があります。/

$old_runまたはの内容が$new_runあなたの管理下にない場合、批判的脱出を行うか、そうでない場合このコードはコード挿入の脆弱性と同じです。

答え2

これは働きます:

cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/'

私は同じファイルを「再利用」したいので、同様のアプローチをしたい人全員にこれを実際に使用します。

cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/' > new_update; mv -f new_update update_via_sed.sh

上記のコマンドは新しいファイルを作成し、現在のファイルを削除し、新しいファイルの名前を現在のファイルに変更します。

答え3

二重引用符(一重引用符ではない)内にある限り、sedで変数を使用できます。

sed "s/$var/r_str/g" file_name >new_file

/変数にスラッシュ()がある場合は、以下のように別の区切り文字を使用してください。

sed "s|$var|r_str|g" file_name >new_file

答え4

man bash一重引用符に関する情報を提供します。

文字を一重引用符で囲むと、引用符内の各文字のリテラル値が保持されます。前にバックスラッシュがある場合でも、一重引用符の間に一重引用符を使用することはできません。

コマンドラインに何を入力しても、bashはそれを解釈して結果を送信先プログラムに送信します。この場合、sed 's/$old_run/$new_run/'bashを使用すると、最初に表示されるのは、sedこれを$PATH変数に存在する実行可能ファイルとして認識することです。実行sedファイルには入力が必要です。 Bashは入力を探して's/$old_run/$new_run/'。一重引用符は、bashが内容を解釈せずにそのまま渡すことを示します。だからbashはそれらをsedに渡します。 Sedは$行末でのみ発生する可能性があるため、エラーを表示します。

対照的に、二重引用符を使用すると、つまり"s/$old_run/$new_run/"bashはそれを見て$old_run変数名として解釈して置き換えます(このステップを変数拡張と呼びます)。これが実際に私たちに必要なものです。

ただし、二重引用符は最初に bash によって解釈され、次に sed に提供されるので、二重引用符を使用するときは注意が必要です。したがって、一部の記号(`など)は使用する前にエスケープする必要があります。

関連情報