所以,如果标题没有意义,这就是我想要做的:
我有文件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/