2

同様の問題を検索しましたが、私のニーズにぴったり合うものは見つかりませんでした。

複数のWebサイトから取得した非常に大きなHTMLファイルがあり、すべてを置き換えたい

class="key->from 2nd file"

style="xxxx"

現時点で私は使用していますsed-それはうまく機能しますが、小さなファイルでのみ機能します

キーを読んでいる間; do sed -i "s / class = \" $ key \ "/ style = \" xxxx \ "/ g" file_to_process; 完了<キー

もっと大きなものを処理しようとすると、何年もかかります

例:

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

必要な処理の1/10だけを完了するのに約40秒かかります

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

5 に答える 5

2

サンプル入力と期待される出力を提供しなかったため、テストされていません。

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
于 2012-10-30T15:11:10.800 に答える
1

Perlの時間だと思います(テストされていません):

my $keyfilename = 'somekeyfile'; // or pick up from script arguments
open KEYFILE, '<', $keyfilename or die("Could not open key file $keyfilename\n");
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 $htmlfilename\n");
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;
}

これは、キーのルックアップにハッシュを使用します。これは適度に高速である必要があり、行にクラスステートメントが含まれている場合にのみキー自体でこれを実行します。

于 2012-10-30T15:25:43.003 に答える
0

キーファイルのすべてのサブコマンドを使用して、次のような非常に長いsedスクリプトを生成してみてください。

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

このファイルを使用します。このようにして、入力ファイルを1回だけ読み取ります。

于 2012-10-30T15:05:45.697 に答える
0

使用する1つの方法は次の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。

于 2012-10-30T15:05:48.187 に答える
0

まず、キーファイルを次のようなsedまたはパターンに変換しますkey1|key2|key3|...。これは、コマンドを使用して実行できますtr。このパターンができたら、1つのsedコマンドで使用できます。

次のことを試してください。

sed -i -r  "s/class=\"($(tr '\n' '|' < keys | sed 's/|$//'))\"/style=\"xxxx\"/g" file
于 2012-10-30T15:11:13.457 に答える