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アドレスを一致させるために使用していますが、sed
IP以外のアドレスを仮想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.256
IPv4アドレスのように見えますが、そうではありません)。
一致のみ効果的な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