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