태그 내용을 기반으로 HTML 파일 이름 바꾸기

태그 내용을 기반으로 HTML 파일 이름 바꾸기

h1 태그의 내용을 기반으로 이름을 바꾸고 싶은 html 파일이 많이 있습니다.

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

그리고:

문서:

<!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"' _ {} \;
  • nametagname-새 파일 이름에 값이 할당되는 변수(레이블의 내용)
  • [ ! -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

내 파일에 아주 잘 작동해요!

관련 정보