例如,用 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