如何使用 Unix 按标题重命名所有 html 文件?

如何使用 Unix 按标题重命名所有 html 文件?

例如,用 TEXT 中包含的文本重命名目录中的所有 HTML 文件?

grep、sed 和 mv 的组合可以工作吗?

例如,我有一个包含 1.html 的文件。 1.html 的标题作为 TEXT 包含在 HTML 文件中(它包含在标题标签 TEXT 中。我想将 1.html 重命名为 TEXT.html

如果一个文件名为5.html,并且5.html的标题是TEST2,那么我想将5.html重命名为TEST2.html。

答案1

for file in *.html ; do 
    name="$(sed -n '/<title>/{s=[^>]*title>==;s=</title.*==;s=[^0-9A-Za-z-_]=_=g;p;q}' "$file")"
    if [ -f "$name" ]; then
       [ -f "${name}_$file" ] || mv -f "$file" "${name}_$file"
    else
       mv -v "$file" "${name}.html"
    fi
done

sed解释:

    /<title>/ -- finds the string with <title> and 
                 applies a group of commands to it
    {}        -- a group of commands
    s=[^>]*title>== -- removes everything before <title> including tag
    s=</title.*==   -- removes everything after </title> including tag
    s=[^0-9A-Za-z-_]=_=g -- substitute all non alphabet/num characters to _  
    p -- print the output
    q -- exit as there is no need to process rest of the file

附注在echo每个之前mv以干模式运行并验证一切看起来都正常。

pps。 sed 构造还期望 fdjskjfls 位于一行上,并且在同一行之前没有任何标记。

答案2

我会使用更简单的方法,假设你有 GNU grep

for f in *.html ; do 
    mv -v "$f" "$(grep -oP '<title>\K.+?</title>' $f | sed 's#</title>##').html"
done

相关内容