如何用虛擬 IP 位址替換與 IP 位址不符的字串?

如何用虛擬 IP 位址替換與 IP 位址不符的字串?

我有一個包含 IP 位址清單的文件,但有些字串不是 IP 位址,我想用虛擬 IP 位址替換這些字串。

我用它grep來搜尋IP;但不知道如何替換與虛擬 IP 位址不符的內容。我相信這可以透過 來完成sed。我嘗試了一些方法,但沒有一個起作用。

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

我用它sed來匹配文件中的 IP 位址,但我不知道如何用虛擬 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 點分四組位址,但看起來與它們相似(例如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]?)

這需要正確錨定,例如在兩端使用^$,或和。\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

這兩者都會將整個輸入行變更為 192.168.0.0,除非該行與有效的 IPv4 位址相符。

就我個人而言,我會使用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 位址選擇的正規表示式有缺陷。我不會嘗試在這裡解決這個問題,因為它在其他地方已經得到了很好的介紹。

你可以使用 sedC在與您的 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

  • 定義由一到三位數字組成的八位元組的正規表示式,並限制為非零前導,除非它是個位數。
  • 符合該行恰好包含 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

相關內容