Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl命令行替代_Regex_Perl_Command Line_Substitution - Fatal编程技术网

Regex perl命令行替代

Regex perl命令行替代,regex,perl,command-line,substitution,Regex,Perl,Command Line,Substitution,我有一个IP或主机名列表,我想将它们与我的数据库进行比较,我正试图通过命令行进行比较,我会将其分解 我的ip列表如下所示 10.0.0.1 10.1.1.1 10.2.2.2 hostname-as-12 ... etc 10.0.0.1:10.0.0.1 10.1.1.1:10.1.1.1 10.2.2.2: #case not found hostname-as-12:10.3.3.3 我的数据库如下所示: hostname:ip:location:contact

我有一个IP或主机名列表,我想将它们与我的数据库进行比较,我正试图通过命令行进行比较,我会将其分解

我的ip列表如下所示

10.0.0.1
10.1.1.1
10.2.2.2
hostname-as-12
... etc
10.0.0.1:10.0.0.1
10.1.1.1:10.1.1.1
10.2.2.2:           #case not found
hostname-as-12:10.3.3.3
我的数据库如下所示:

hostname:ip:location:contact
perl -i.back -pe 's/^(.+)$/$1:`grep $1 /directory/tmp/datbase.txt` | cut -d : -f2`/' iplist
伪代码就像

open iplist
compare to database
replace inline iplist with new information
我想从命令行执行此操作(如果没有,则了解有关使用它的更多信息)

当前,我的命令行如下所示:

hostname:ip:location:contact
perl -i.back -pe 's/^(.+)$/$1:`grep $1 /directory/tmp/datbase.txt` | cut -d : -f2`/' iplist
那么iplist就会这样改变

10.0.0.1
10.1.1.1
10.2.2.2
hostname-as-12
... etc
10.0.0.1:10.0.0.1
10.1.1.1:10.1.1.1
10.2.2.2:           #case not found
hostname-as-12:10.3.3.3

在命令行Perl中,可以使用
BEGIN
块在开始时首先创建散列。
File::Slurp
模块为您提供了读取数据库文件的快捷方式

附加的
-l
选项在每次打印后添加一个换行符,这样您就可以安全地
选择输入并将其用作哈希键,而不必记住在输出中包含额外的换行符:

perl -i.back -MFile::Slurp -ple 'BEGIN { %db = map {m/^([^:]+):([^:]+)/; ($2 => $1)} read_file("/directory/tmp/database.txt") } chomp; $_ .= ":" . $db{$_} || ""' iplist
测试:


如果没有
File::Slurp
模块,您只需要像平常一样打开并读取文件,在相同的
BEGIN
块中,填充
%db
散列。

您不需要使用正则表达式或perl,可以使用awk来完成。您不需要使用awk,您可以使用Perl来实现这一点。您的数据库文件非常大吗?在这种情况下:将数据库文件读入哈希,然后使用哈希匹配IP。这将比您当前的解决方案快得多,也更准确。我尝试将此作为命令行解决方案,这是最优雅的方式吗?