То есть переименовать все HTML-файлы в каталоге, используя текст, содержащийся в TEXT?
Может ли сработать комбинация grep, sed и mv?
Например, у меня есть файл, содержащий 1.html. Заголовок 1.html содержится в HTML-файле как TEXT (он содержится внутри тегов заголовка 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
ps. 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