私がしたい:
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 に提供されるので、二重引用符を使用するときは注意が必要です。したがって、一部の記号(`など)は使用する前にエスケープする必要があります。