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
答え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