我有很多html文件,我想根据标签h1的内容重命名。
关于如何在 bash 上执行此操作有什么建议吗?
文件示例:
<!DOCTYPE html><html lang="pt-BR"><head><meta charset="utf-8"><title>Repositório - MAIS</title>
<script src="lib/tudo.js"></script>
<link rel="stylesheet" href="lib/style.css">
</head>
<body>
<div id="cabecalho"></div>
<div id="corpo">
<h1>teste</h1>
<div class="Experimento"></div>
<div class="gallery">
<img class="image-gallery" src="img/2dados.png">
</div>
<br><br><strong>Mídia:</strong> experimento (uma aula dupla)
<br><br><strong>Descrição:</strong> este experimento propõe 4 jogos diferentes, todos baseados no lançamento de 2 dados comuns. Discutindo as chances de cada jogador vencer cada um dos jogos, os estudantes terão a chance de discutir vários conteúdos relacionados à probabilidade
<br><br><strong>Conteúdo:</strong> experimento aleatório, espaço amostral, eventos equiprováveis, probabilidade
<br><br><strong>Recomendação de uso:</strong> este experimento pode ser usado como introdução ou aplicação dos conceitos iniciais de probabilidade.
<br><br><strong>Autoria:</strong> este experimento foi desenvolvido pela <a class="externo" href="http://www.mais.mat.br" target="_blank">Mais</a> e pode ser utuilziado e distribído livremente, contanto que citada a autoria original.
<a class="download" href="http://www.mais.mat.br/recursos/images/5/5b/2dados.pdf">Baixar</a>
</div>
<div id="rodape"></div>
</body>
</html>
我希望将文件重命名为“teste.html”
如果有帮助,此标记始终单独位于每个文件的第 8 行(同一行上没有其他内容)。此外,每个文件中始终只出现一次 h1。
答案1
和xmllint:
文件:
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<a>foo</a>
<b>bar</b>
<c>base</c>
</body>
</html>
命令:
for file in *.html; do
tag=$(xmllint --xpath '//b/text()' $file)
echo mv "$file" "${tag}_$file"
done
评论:
当您的测试可以真正运行该命令时,请推迟 echo 命令
答案2
正确的方法是与find
+xmlstarlet
工具:
find . -type f -name "*.html" -exec sh -c \
'name=$(xmlstarlet sel -t -v "//tagname" $1 2>/dev/null);
[ ! -z "$name" ] && echo mv "$1" "${1%%/*}/${name}.html"' _ {} \;
name
tagname
-为新文件名分配值(标签的内容)的变量[ ! -z "$name" ]
- 检查新文件名是否不为空(即<tagname>
找到并且它有一个值)
答案3
使用 xmlstarlet:
xmlstarlet format --html teste.html | xmlstarlet select --html --template --value-of '//html/body/div/h1'
输出:
泰斯特
我曾经xmlstarlet format --html teste.html
修复过你的无效 html 代码。
答案4
我的最终解决方案是下面的代码,结合了两个建议。感谢你们!
for file in *.html; do
tag=$(xmlstarlet format --html $file | xmlstarlet select --html --template --value-of '//html/body/div/h1')
mv "$file" "${tag}.html"
done
它对我的文件非常有用!