web-dev-qa-db-ja.com

シェルスクリプトでsedを使用してファイルのIPアドレスを置き換える

ファイル内の文字列を見つけて新しい文字列に置き換えるスクリプトがあります。

$ sed -i 's/$old_string'/'$new_string'/g' $FILENAME

ここで、条件には、古い文字列の後に数字以外が続くかどうかもチェックする正規表現である必要があります。

私はこれを試しましたが、うまくいきませんでした:

$ sed -i -r 's/$old_string(^[0-9])+/$new_string/g' $FILENAME

何か案が?

2
edotan

正規表現の範囲を否定するには、キャレットがinside角かっこである必要があります。

sed -i -r 's/$old_string([^0-9])+/$new_string/g' $FILENAME

この場合、後方参照を使用していない場合(そして実際のように見えない場合)、括弧も不要です。

sed -i -r 's/$old_string[^0-9]+/$new_string/g' $FILENAME

最後に、bashは単一引用符内の変数を解析しないため、$old_string$new_stringは、スクリプトで設定したbash変数に置き換えられませんが、sedでそのまま使用されます。コマンド。二重引用符を使用すると、それらは置き換えられます。

sed -i -r "s/$old_string[^0-9]+/$new_string/g" $FILENAME

更新:

置換する文字列の後に何も含まれていないため、正規表現の[^0-9]+の部分は何も一致しません。 IPアドレスの後にスペースがあれば機能します。代わりに、行の終わりを$と一致させることができます。

sed -i -r 's/123.123.123.1$/4.4.4.4/g' $FILENAME

もう1つの更新。これは、数字ではない、または文字がまったくない任意の文字と一致します。この場合、2つのオプションをグループ化するために括弧が必要です。

sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4/g' $FILENAME

括弧があるので、後方参照を使用して、一致したものをすべて含めることができます。

sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4\1/g' $FILENAME
6
Ladadadada