私はやってみたいです:
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}/'
「インプレース」sed(-iフラグを使用)が答えでした。 peterphに感謝します。
sed -i "s@$old@$new@" file
あなたがすることができます:
sed "s/$old_run/$new_run/" < infile > outfile
ただし、$old_run
は正規表現として扱われるため、/
や.
などの変数に含まれる特殊文字は エスケープする にする必要があることに注意してください。 。同様に、$new_run
では、&
および\
文字を特別に扱う必要があり、/
および改行文字をエスケープする必要があります。
$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"'/' > new_update; mv -f new_update update_via_sed.sh
上記は新しいファイルを作成し、現在のファイルを削除してから、新しいファイルの名前を現在のファイルに変更します。
Sed内では、(単一引用符ではなく)二重引用符で囲まれている限り、変数を使用できます。
sed "s/$var/r_str/g" file_name >new_file
スラッシュ(/
)変数で、次のように別のセパレータを使用します
sed "s|$var|r_str|g" file_name >new_file
$ echo $d1 | sed -i 's/zkserver1/'${d1}'/g' deva_file
sed: -e expression #1, char 26: unterminated `s' command
$d1
に値を保存しています
変数の値を置き換えることができないので、次のコマンドを実行してみました。
echo $d1 | sed -i 's/zkserver1/'"${d1}"'/g' deva_file
"${d1}"
に二重引用符がありません。それがエラーでした。
軽蔑される危険がある-Perl
を検討しましたか?.
これは、とりわけ、「sedスタイル」の操作を実行するのに非常に適していますが、より完全な機能を備えたプログラミングも重要です。
それはlooks例のように、あなたがしている実際にしようとしていることは、数値をインクリメントすることです。
だからどうですか:
#!/usr/bin/env Perl
use strict;
use warnings 'all';
while ( <DATA> ) {
s/old_name_(\d+)/"old_name_".($1+1)/e;
print;
}
__DATA__
old_name_932
またはワンライナーとして-sedスタイル:
Perl -pe 's/old_name_(\d+)/"old_name_".($1+1)/e'