1

実際のファイル名に使用したい名前のタグを含むいくつかのHTMLファイル。HTMLファイルの例:

    <div class="top">SomethingFile</div>
    <a href="../files/15d705df3.txt"/>

出力:SomethingFileタグを15d705df3.txtの名前にします

    15d705df3.txt --> SomethingFile.txt

名前を変更したいのと同じ形式の約800以上のテキストファイルとHTMLファイルがあります。私はこれをawk、sed、grepで動作させようとしています。しかし、残念ながら私は途方に暮れていて、最初の2つの変数を作成し、これらを使用してファイルの名前を変更することに固執しています。

4

4 に答える 4

2

awk、、sedおよびgrepはこのタスクに適したツールではありませんが、代わりに私はあなたをお勧めします

xmllint --html --xpath '/Xpath/expression' file.html

Xpath式を使用します。

基本的に

xmllint --html --xpath '//div[@class="top"]/text()' file.html

ついに

for f in *.html *.txt; do
    filename=$(xmllint --html --xpath '//div[@class="top"]/text()' "$f")
    mv "$f" "$filename.txt"
done
于 2013-02-20T15:14:01.617 に答える
0

ファイルをループし、を使用sedしてファイルの新しい名前を抽出してから、ファイルの名前を変更します。

for file in *
do
    name=$(sed -n 's|.*<div class="top">\(.*\)</div>|\1|p' "$file")
    mv "$file" "$name.txt"
done
于 2013-02-20T15:16:40.593 に答える
0

パーサーperlの助けを借りて使用する1つの解決策:htmlHTML::TokeParser

#!/usr/bin/env perl

use warnings;
use strict;
use HTML::TokeParser;
use File::Spec;

my ($newfile, $currentfile);

## Give as arguments the html files to process, like *.html
for ( @ARGV ) { 
    my $p = HTML::TokeParser->new( $_ ) or die;

    ## Search a "div" tag with the attribute "class" to value "top".
    while ( my $info = $p->get_tag( 'div' ) ) { 
        if ( $info->[1]{class} eq 'top' ) { 

            $newfile = $p->get_text;

            ## Omit next two tokens until following "a" tag (</div>, space).
            $info = $p->get_token for 1 .. 3;

            ## If tag is a start 'a' tag, extract file name of the href attribute.
            if ( $info->[0] eq 'S' &&
                 $info->[1] eq 'a' ) { 
                $currentfile = ( File::Spec->splitpath( $info->[2]{href} ) )[2];
                $newfile .= join q||, (split /(\.)/, $currentfile)[-2 .. -1];
            }   
            last;
        }   
    }   

    ## Rename file.
    if ( $newfile && $currentfile ) { 
        printf STDERR qq|Renaming --> %s <-- to --> %s <--\n|, $currentfile, $newfile;
        rename $currentfile, $newfile;
    }   
    $newfile = $currentfile = undef;
}

次のように実行します。

perl-5.14.2 script.pl *.html

そして、私のテストの1つでの結果は、次のようになります。

Renaming --> 15d705df3.txt <-- to --> SomethingFile1.txt <--
Renaming --> 15d705dg6.txt <-- to --> SomethingFile2.txt <--
于 2013-02-20T16:17:50.643 に答える
0

@sputnickに触発されたが、の代わりにXmlstarletxmllintを使用した回答。

xml sel -T -t -o "mv " -f -o " " -t -v 'string(//div[@class="top"])' -o ".txt" -nl *.html 

与える:

mv t.html SomethingFile.txt
mv tt.html SomethingElse.txt

あなたがそれがするだろうと思うことに満足しているとき。

xml sel -T -t -o "mv " -f -o " " -t -v 'string(//div[@class="top"])' -o ".txt" -nl *.html | sh

種を蒔き、私が便乗できるようにしてくれた@sputnickの功績です。

于 2013-02-20T18:46:20.413 に答える