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 来解决这个问题。但不幸的是,我不知所措,坚持创建最初的两个变量并使用它们重命名文件。

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

在解析器perl的帮助下使用的一种解决方案: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

在我的一项测试中,结果应该类似于:

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

受@sputnick 启发但使用Xmlstarlet而不是xmllint.

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 回答
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 回答