搜索了类似的问题,找不到适合我需求的东西:
我有一个很大的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