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

おすすめ記事