用另一个文件的字符串替换一个文件中字符串的有效方法



搜索了类似的问题,找不到适合我需求的东西:

我有一个很大的HTML文件,从多个网站上刮下来,我想替换所有

class="key->from 2nd file"

style="xxxx"

目前我使用sed-它运行良好,但仅与小文件

阅读键;做sed -i" s/class = " $ key "/style = " xxxx "/g" file_to_process;完成<键

当我试图处理更大的东西时,年龄

示例:

keys - Count: 1233 lines
file_to_ process - Count: 1946 lines

只需要40秒钟才能完成1/10的处理,我需要

real    0m40.901s
user    0m8.181s
sys     0m15.253s

未测试,因为您没有提供任何样本输入和预期输出:

awk '
NR==FNR { keys = keys sep $0; sep = "|"; next }
{ gsub("class="(" keys ")"","style="xxxx"") }
1' keys file_to_process > tmp$$ &&
mv tmp$$ file_to_process

我认为是时候进行perl(未经测试):

my $keyfilename = 'somekeyfile'; // or pick up from script arguments
open KEYFILE, '<', $keyfilename or die("Could not open key file $keyfilenamen");
my %keys = map { $_ => 1 } <KEYFILE>; // construct a map for lookup speed
close KEYFILE;
my $htmlfilename = 'somehtmlfile'; // or pick up from script arguments
open HTMLFILE, '<', $htmlfilename or die("Could not open html file $htmlfilenamen");
my $newchunk = qq/class="xxxx"/;
for  my $line (<$htmlfile>) {
    my $newline = $line;
    while($line =~ m/(class="([^"]+)")/) {
        if(defined($keys{$2}) {
            $newline =~ s/$1/$newchunk/g;
        }
    }
    print $newline;
}

这将使用一个哈希来查找键,该键应该非常快,并且仅在行包含类语句时才在密钥本身上执行此操作。

尝试生成一个很长的sed脚本,并使用键文件中的所有子命令,类似于:

s/class="key1"/style="xxxx"/g; s/class="key2"/style="xxxx"/g ...

并使用此文件。这样,您将仅读取输入文件一次。

这是使用GNU awk

的一种方法
awk 'FNR==NR { array[$0]++; next } { for (i in array) { a = "class="" i """; gsub(a, "style="xxxx"") } }1' keys.txt file.txt

请注意,keys.txt中的密钥被视为整行,包括空格。如果领先和滞后空间可能是一个问题,请使用$1代替$0。不幸的是,没有某些示例数据,我无法正确测试。hth。

首先将您的键文件转换为看起来像这样的SED或模式:key1|key2|key3|...。可以使用tr命令来完成。有了此模式后,您可以在单个sed命令中使用它。

尝试以下内容:

sed -i -r  "s/class="($(tr 'n' '|' < keys | sed 's/|$//'))"/style="xxxx"/g" file

相关内容

  • 没有找到相关文章

最新更新