Jav*_*lez 3 text-processing ip-address
我有一个包含 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}'
Run Code Online (Sandbox Code Playgroud)
我有这个sed
来匹配文件中的 IP 地址,但我不知道如何用虚拟 IP 替换非 IP 地址。
sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file.txt
Run Code Online (Sandbox Code Playgroud)
输入:
192.168.10.20
00 03
10.28.214.5
192.168.10.40
BF
192.168.10.50
Run Code Online (Sandbox Code Playgroud)
期望输出:
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
Run Code Online (Sandbox Code Playgroud)
谢谢!
您的正则表达式将匹配不是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]?)
Run Code Online (Sandbox Code Playgroud)
或(没有 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]?)
Run Code Online (Sandbox Code Playgroud)
并且这需要被正确固定,例如用^
和$
,\b
在两端,或\<
和\>
。
请参阅:正则表达式食谱 O'Reilly Media, Inc. 出版的 Jan Goyvaerts 和 Steven Levithan 的。
例如
$ 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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
这两个都将整个输入行更改为 192.168.0.0,除非该行与有效的 IPv4 地址匹配。
就个人而言,我会使用 perl 的Regexp::Common模块,它是用于常见模式匹配任务的大量正则表达式集合,可以方便地在名为%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
Run Code Online (Sandbox Code Playgroud)
注意:其他人指出您为 IPv4 地址选择的正则表达式存在缺陷。我不会尝试在这里解决这个问题,因为它在其他地方已经很好地涵盖了。
您可以在与您的 RE不匹配的行上使用 sed 的c 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
Run Code Online (Sandbox Code Playgroud)
使用 GNU sed,您可以简化为
sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/!c192.168.0.0' file.txt
Run Code Online (Sandbox Code Playgroud)
sed '/^\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}$/!s/.*/192.168.0.0/' data
Run Code Online (Sandbox Code Playgroud)
如果该行不是有效的 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
Run Code Online (Sandbox Code Playgroud)
或者perl
:
perl -MNet::IP -ple '$_ = "192.168.0.0" unless new Net::IP($_)' data
Run Code Online (Sandbox Code Playgroud)