IPアドレスと一致しない文字列を仮想IPアドレスに置き換えるにはどうすればよいですか?

IPアドレスと一致しない文字列を仮想IPアドレスに置き換えるにはどうすればよいですか?

IPアドレスのリストを含むファイルがありますが、一部の文字列はIPアドレスではなく、この文字列を仮想IPアドレスに置き換えたいと思います。

IPを取得するために使用しているgrepが仮想IPアドレスと一致しないエントリを置き換える方法がわかりません。私はこれを介して行うことができると思いますsed。私はいくつか試しましたが、そのうち何も動作しませんでした。

cat file.txt | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

私はファイル内のIPアドレスを一致させるために使用していますが、sedIP以外のアドレスを仮想IPに置き換える方法がわかりません。

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file.txt

入力する:

192.168.10.20
00 03
10.28.214.5
192.168.10.40
BF
192.168.10.50

希望の出力:

192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50

ありがとうございます!

答え1

正規表現は次のようになります。いいえIPv4は4つのアドレスグループに点を付けますが、似ているようです(たとえば、256.256.256.256IPv4アドレスのように見えますが、そうではありません)。

一致のみ効果的なIPv4アドレスの場合は正規表現を使用する必要があります。例:

(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

または(Perlish?:非キャプチャグループ修飾子を除く):

((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

^これには、and $、またはandを両端に使用するなど、適切なアンカーリングが必要です。\b\<\>

望むより:正規表現レシピ著者:Jan GoyvaertsおよびSteven Levithan出版社:O'Reilly Media、Inc。

例えば

$ sed -E '/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/!s/.*/192.168.0.0/' file.txt 
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
$ perl -p -e 's/.*/192.168.0.0/ unless m/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/' file.txt 
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50

どちらも、ラインが有効なIPv4アドレスと一致しない限り、入力ライン全体を192.168.0.0に変更します。

個人的に私はPerlを使いたい正規表現::共通モジュールは一般的なパターンマッチング操作のための大規模な正規表現のコレクションで、名前で便利に使用できます%RE

$ perl -MRegexp::Common -p -e 's/.*/192.168.0.0/ unless m/^$RE{net}{IPv4}$/' file.txt 
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50

答え2

注:他の人は、IPv4アドレスに対して選択した正規表現に欠陥があると指摘しました。この問題は他の場所でうまく扱われたので、ここでは扱いません。

あなたはsedを使用することができますRE()と一致しない!行でhangeコマンドを実行してください。

$ sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/!c\
192.168.0.0
' file.txt
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50

GNU sedを使用すると、次のように単純化できます。

sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/!c192.168.0.0' file.txt

答え3

sed '/^\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}$/!s/.*/192.168.0.0/' data

行が有効なIPv4アドレスでない場合は、現在の行を次に置き換えます192.168.0.0

仮想アドレスに異なる値を使用することをお勧めしますが、192.168.0.0これはあなたとあなたのニーズによって異なります。

または同じですが、次のようになりますawk

awk '!/^([0-9]{1,3}\.){3}[0-9]{1,3}$/ {$0="192.168.0.0"}1' data

またはperl:

perl -MNet::IP -ple '$_ = "192.168.0.0" unless new Net::IP($_)' data

答え4

そしてPerl

  • 1〜3桁の数字で構成されるオクテットを定義する正規表現で、1桁の数字以外の前にゼロ以外の数字に制限されます。
  • ドットで区切られた正確に4つのオクテットを含む行と一致します。
  • 行をポイントに分割すると、すべてのタプルは256未満です。
dummy=192.168.0.0 \
perl -MList::Util=all -lpe '
  $octet //= qr/(?!0\d)\d{1,3}/;

  /^$octet(?:[.]$octet){3}$/ &&
   all { $_<256 } split /[.]/ or
     $_ = $ENV{dummy};
' file

関連情報