web-dev-qa-db-ja.com

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}/'
65
Michael Durrant

「インプレース」sed(-iフラグを使用)が答えでした。 peterphに感謝します。

sed -i "s@$old@$new@" file
21
Michael Durrant

あなたがすることができます:

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

ただし、$old_runは正規表現として扱われるため、/.などの変数に含まれる特殊文字は エスケープする にする必要があることに注意してください。 。同様に、$new_runでは、&および\文字を特別に扱う必要があり、/および改行文字をエスケープする必要があります。

$old_runまたは$new_runのコンテンツが管理下にない場合、そのエスケープを実行することが重要です。そうでない場合は そのコードはコードインジェクションの脆弱性になります

49

これはうまくいきました:

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

上記は新しいファイルを作成し、現在のファイルを削除してから、新しいファイルの名前を現在のファイルに変更します。

31
Michael Durrant

Sed内では、(単一引用符ではなく)二重引用符で囲まれている限り、変数を使用できます。

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

スラッシュ(/)変数で、次のように別のセパレータを使用します

sed "s|$var|r_str|g" file_name >new_file
23
mani
$ 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}"に二重引用符がありません。それがエラーでした。

2
deva

軽蔑される危険がある-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'
1
Sobrique