perl - 需要将 file2 中与 file1 第一列匹配的字符串替换为 file1 第二列

标签 perl bash sed awk

所以,如果标题没有意义,这就是我想要做的:

我有文件1:

66.115.135.84:123.123.123.1
66.115.135.85:123.123.123.2
66.115.135.86:123.123.123.3
66.115.135.87:123.123.123.4
66.115.135.88:123.123.123.5
66.115.135.89:123.123.123.6
66.115.135.90:123.123.123.7
66.115.135.91:123.123.123.8
66.115.135.92:123.123.123.9
66.115.135.93:123.123.123.10
66.115.135.94:123.123.123.11
66.115.135.95:123.123.123.12
66.115.135.96:123.123.123.13
66.115.135.97:123.123.123.14

如您所见,它是 IP 地址,以“:”分隔

File2 基本上是一个 apache 虚拟主机条目,或 httpd.conf 文件。这并不重要。只需知道 file2 包含 file1 第一列中某处的 IP 地址即可。并且需要将它们替换为 file1 的第二列。

出于某种原因,这个简单的问题让我感到困惑。我尝试过一些非常粗糙的事情,但总是陷入困境。

我知道我可以使用 awk 将它们分开,并且我知道我可以将其通过管道传输到 sed 中以对 file2 进行操作。

但我似乎无法理解将第 1 列“映射”到第 2 列的最佳方法,以便这实际上可以发生。

我愿意使用 perl、ruby、python,或者任何实现此目的的方法,并且我非常希望能简要解释一下如何解决此问题。

请要求任何澄清,我很乐意提供。

提前非常感谢!

最佳答案

将 file1 中的 IP 对读取到哈希值中,例如$ip{$old} = $new。我假设没有重复的IP。通过 file2 查找 IP,并使用正则表达式,例如:

s#($IPregex)# $ip{$1} // $1 #eg;

代码如下:

use autodie;

open my $fh, '<', "file1";
my %ip;
while (<$fh>) {
    chomp;
    my ($key, $val) = split /:/, $_, 2;
    $ip{$key} = $val;
}

open $fh, '<', "file2";
my $rx = qr/\b\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}\b/;

while (<$fh>) {
    s#($rx)# $ip{$1} // $1 #eg;
    print;
}

根据需要重定向到输出文件。 IP 可能需要更好的正则表达式。

关于perl - 需要将 file2 中与 file1 第一列匹配的字符串替换为 file1 第二列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7735653/

相关文章:

algorithm - 暴力破解我的 gpg 密码

bash - 在 Bash 中模拟 do-while 循环

linux - 用文件中的下划线替换空格 (bash)

regex - 如何使用 sed 忽略但保留 ANSI 转义码?

perl - 如何比较代码中的几个二进制字节?

perl - File::Slurp 成多 GB 标量 - 如何有效拆分?

linux - 将/etc/yum.repos.d/* 复制到所有计算机上的同一目录,而无需重复输入 root 密码

bash - 如何为每个 ping 结果添加时间戳?

perl - 使 sed 不按行缓冲

regex - 从两个文本文件中获取公共(public)行