sedを使用してIPv4アドレスの最後のオクテットを変更された部分に渡すには?

sedを使用してIPv4アドレスの最後のオクテットを変更された部分に渡すには?

ネットワークを64のIPから128のIPにアップグレードする予定です。もちろん、40を超えるすべてのVMで手動で変更したくありません。 sed -i で ansible ad-hoc コマンドを使用し、同じコマンドを使用してインターフェイスを再起動する予定です。私はこれを試しましたが、住所でスラッシュを変更する方法の解決策を見つけました。ただし、IPアドレスの最後のオクテットを変数として出力に渡す必要があります。ここでは動作しますが、部分的にのみ動作します。

オリジナル:

address 195.23.154.X/26

私が望むもの:

 address 195.34.154.X/25

存在する/etc/network/interfaces/

エスケープされたスラッシュを含むジョブsedコマンドの一部:

 sed 's/address\ 195.24.153.3\/26/address\ 195.23.154.4\/27/g' interfaces.bak

この例では、「3」をどのように保存できますか?

答え1

コマンド構文のすべてのスラッシュをsed別の文字に置き換え、パターンまたは置換にスラッシュを保持します。

sed 's#foo/bar#foo/baz#'

別のオプションは、文字列内のすべてのスラッシュをエスケープすることです。

sed 's/foo\/bar/foo\/baz/'

答え2

実際に仮定しましょう必要addressIPアドレスの最初の3つの部分が後に続く文字列を明示的に一致させ、/26次にサブネットマスクを更新します/25

sed 's|\(address 195\.23\.154\.[0-9]*\)/26|\1/25|'

まず、これをコマンド|の区切り文字として使用しますs///。スラッシュを避ける必要がないようにします。任意の単一文字を代替コマンドで区切り文字として使用できます(改行文字などのいくつかの明確な文字を除く)。

次に、アドレスのスラッシュに一致する文字列の最初の部分をキャプチャします\(...\)(この位置でリテラルポイントのみを一致させるには、式でポイントをエスケープする必要があります)。その後、逆参照を使用して\1コマンドの代替部分に挿入できます。

IPアドレスの最後の部分もキャプチャして素直に一致させるため、[0-9]*この部分は変更されていない代替アドレスに送信されます。

テスト:

$ echo 'address 195.23.154.112/26' | sed 's|\(address 195\.23\.154\.[0-9]*\)/26|\1/25|'
address 195.23.154.112/25

関連情報