ファイル内の文字列を見つけて新しい文字列に置き換えるスクリプトがあります。
$ sed -i 's/$old_string'/'$new_string'/g' $FILENAME
ここで、条件には、古い文字列の後に数字以外が続くかどうかもチェックする正規表現である必要があります。
私はこれを試しましたが、うまくいきませんでした:
$ sed -i -r 's/$old_string(^[0-9])+/$new_string/g' $FILENAME
何か案が?
正規表現の範囲を否定するには、キャレットが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