求助:如何用Perl脚本查找并替换字符串或文件中的IP地址
Perl脚本实现IP地址的查找与替换
基于你已有的Regexp::Common::net模块使用基础,下面直接给出实现两个需求的方案:
一、处理字符串中的IP替换
直接使用Perl的正则替换操作符s///,结合$RE{net}{IPv4}匹配合法IPv4地址,全局替换为指定内容:
#!/usr/bin/perl use strict; use warnings; use Regexp::Common qw/net/; # 待处理的字符串 my $Event_text = "This is a test string with IPs 10.10.10.20 and 192.168.1.1, plus invalid 999.999.999.999"; # 全局替换所有合法IP为X.X.X.X $Event_text =~ s/$RE{net}{IPv4}/X.X.X.X/g; # 输出替换后的结果 print $Event_text, "\n";
运行后输出:
This is a test string with IPs X.X.X.X and X.X.X.X, plus invalid 999.999.999.999
二、处理文件中的IP替换
处理文件时,推荐先读取文件内容,替换后写入新文件(或覆盖原文件,注意备份),以下是两种常见方式:
方式1:一次性读取文件内容替换
适合小文件,操作简单:
#!/usr/bin/perl use strict; use warnings; use Regexp::Common qw/net/; # 输入文件路径 my $input_file = "test.txt"; # 输出文件路径(可设为同路径实现覆盖,建议先备份原文件) my $output_file = "test_modified.txt"; # 读取文件内容 open(my $in_fh, '<', $input_file) or die "无法打开输入文件: $!"; my $content = do { local $/; <$in_fh> }; close($in_fh); # 替换所有合法IP $content =~ s/$RE{net}{IPv4}/X.X.X.X/g; # 写入替换后的内容 open(my $out_fh, '>', $output_file) or die "无法打开输出文件: $!"; print $out_fh $content; close($out_fh); print "替换完成,结果已写入$output_file\n";
方式2:逐行处理文件
适合大文件,减少内存占用:
#!/usr/bin/perl use strict; use warnings; use Regexp::Common qw/net/; my $input_file = "test.txt"; my $output_file = "test_modified.txt"; open(my $in_fh, '<', $input_file) or die "无法打开输入文件: $!"; open(my $out_fh, '>', $output_file) or die "无法打开输出文件: $!"; # 逐行读取并替换 while (my $line = <$in_fh>) { $line =~ s/$RE{net}{IPv4}/X.X.X.X/g; print $out_fh $line; } close($in_fh); close($out_fh); print "替换完成,结果已写入$output_file\n";
关键说明
s/$RE{net}{IPv4}/X.X.X.X/g中的g修饰符表示全局替换,如果不加只会替换每行第一个匹配的IP。Regexp::Common::net会自动匹配合法的IPv4地址,忽略如999.999.999.999这类无效IP,符合你的需求。- 处理文件时,若需要直接覆盖原文件,可将
$output_file设为和$input_file相同,但建议先手动备份原文件避免数据丢失。
内容的提问来源于stack exchange,提问作者dms666
相关产品推荐
相关产品推荐

