在一个文件从列表中的其他文件替换文本?(Replacing text in a file from

2019-09-25 19:09发布

我之前问过这个问题 ,但不认为我真正解释它正确地根据所给出的答案。

我有一个文件名为backup.xml是28000线,包含短语***在它766倍。 我也有一个文件名为list.txt有766线在里面,每一个不同的关键字。

我基本上需要做的是从各行的插入list.txtbackup.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>

任何帮助将不胜感激。 提前致谢!

Answer 1:

在这种情况下,你也许可以逃脱治疗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;


Answer 2:

这个怎么样:

awk '{print NR-1 ",/\\*\\*\\*/{s/\\*\\*\\*/" $0 "/}"}' list.txt > list.sed
sed -f list.sed backup.xml

使用的第一线awk使搜索的列表/替换基于该列表,通过上下一行,然后将其上执行命令sed



Answer 3:

使用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


Answer 4:

如果这两个文件的顺序一致,则可以使用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-


文章来源: Replacing text in a file from a list in another file?