我之前问过这个问题 ,但不认为我真正解释它正确地根据所给出的答案。
我有一个文件名为backup.xml
是28000线,包含短语***
在它766倍。 我也有一个文件名为list.txt
有766线在里面,每一个不同的关键字。
我基本上需要做的是从各行的插入list.txt
到backup.xml
以取代766米的地方***
被提及。
以下是对包含在有一个例子list.txt
:
Anaheim
Anchorage
Ann Arbor
Antioch
Apple Valley
Appleton
下面是与线之一的一个例子***
从它backup.xml
:
<title>*** Hosting Services - Company Review</title>
因此,举例来说,已在第一行***
提及应改为为此,根据上面的示例:
<title>Anaheim Hosting Services - Company Review</title>
任何帮助将不胜感激。 提前致谢!
在这种情况下,你也许可以逃脱治疗XML作为纯文本。 所以读取XML文件,并替换从关键字文件读取一行标志的每一个发生:
#!/usr/bin/perl
use strict;
use warnings;
use autodie qw( open);
my $xml_file = 'backup.xml';
my $list_file = 'list.txt';
my $out_file = 'out.xml';
my $pattern='***';
# I assumed all files are utf8 encoded
open( my $xml, '<:utf8', $xml_file );
open( my $list, '<:utf8', $list_file );
open( my $out, '>:utf8', $out_file );
while( <$xml>)
{ s{\Q$pattern\E}{my $kw= <$list>; chomp $kw; $kw}eg;
print {$out} $_;
}
rename $out_file, $xml_file;
这个怎么样:
awk '{print NR-1 ",/\\*\\*\\*/{s/\\*\\*\\*/" $0 "/}"}' list.txt > list.sed
sed -f list.sed backup.xml
使用的第一线awk
使搜索的列表/替换基于该列表,通过上下一行,然后将其上执行命令sed
。
使用awk
。 它读取backup.xml
文件,发现当***
的文字,我从中提取一个字list.txt
文件。 在BEGIN
块中移除list.txt
从参数列表,以避免其处理。 参数的顺序是非常重要的。 此外,我认为只有一个***
每行字符串。
awk '
BEGIN { listfile = ARGV[2]; --ARGC }
/\*\*\*/ {
getline word <listfile
sub( /\*\*\*/, word )
}
1 ## same as { print }
' backup.xml list.txt
如果这两个文件的顺序一致,则可以使用paste
命令加入两个文件,然后后处理线。
paste list.txt backup.xml |
awk 'BEGIN {FS="\t"} {sub(/\*\*\*/, $1); print substr($0, length($1)+2)}'
粘贴命令将产生如下:
Anaheim \t <title>*** Hosting Services - Company Review</title>
而单行在AWK将取代***与第一场,随后除去所述第一场和后场分离器(\吨)。
另一个变化是:
paste list.txt backup.xml |
awk 'BEGIN {FS="\t"} {sub(/\*\*\*/, $1); print $0}' |
cut -f 2-