Como posso substituir o elemento title em muitos arquivos HTML?

1

Meu diretório ~/foo contém muitos arquivos HTML. Cada um tem um elemento title indesejado diferente. Ou seja, cada arquivo contém o código

<title>something unwanted</title>

Muitos desses arquivos também contêm alguns elementos span como este

<span class="org-document-info-keyword">#+Title:</span> 
<span class="org-document-title">correct title</span>

Gostaria de escrever um script que analise cada arquivo HTML e, para cada arquivo que contenha um bloco de códigos do segundo tipo, substitua o title indesejado pelo título correto.

Assim que o título for substituído, gostaria que o script removesse o código no segundo bloco.

Por exemplo, executando o script em

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<!-- Created by htmlize-1.47 in css mode. -->
<html>
  <head>
    <title>foo.org</title>
    <style type="text/css">
    <!--
      body {
        color: #839496;
        background-color: #002b36;
      }
      .org-document-info {
        /* org-document-info */
        color: #839496;
      }
      .org-document-info-keyword {
        /* org-document-info-keyword */
        color: #586e75;
      }
      .org-document-title {
        /* org-document-title */
        color: #93a1a1;
        font-size: 130%;
        font-weight: bold;
      }
      .org-level-1 {
        /* org-level-1 */
        color: #cb4b16;
        font-size: 130%;
      }

      a {
        color: inherit;
        background-color: inherit;
        font: inherit;
        text-decoration: inherit;
      }
      a:hover {
        text-decoration: underline;
      }
    -->
    </style>
  </head>
  <body>
    <pre>
<span class="org-document-info-keyword">#+Title:</span> <span class="org-document-title">my desired title
</span><span class="org-document-info-keyword">#+Date:</span> <span class="org-document-info">&lt;2015-08-23 Sun&gt;
</span>
<span class="org-level-1">* hello world</span>

Vivamus id enim.  

</pre>
  </body>
</html>

deve resultar em

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<!-- Created by htmlize-1.47 in css mode. -->
<html>
  <head>
    <title>my desired title</title>
    <style type="text/css">
      <!--
      body {
          color: #839496;
          background-color: #002b36;
      }
      .org-document-info {
          /* org-document-info */
          color: #839496;
      }
      .org-document-info-keyword {
          /* org-document-info-keyword */
          color: #586e75;
      }
      .org-document-title {
          /* org-document-title */
          color: #93a1a1;
          font-size: 130%;
          font-weight: bold;
      }
      .org-level-1 {
          /* org-level-1 */
          color: #cb4b16;
          font-size: 130%;
      }

      a {
          color: inherit;
          background-color: inherit;
          font: inherit;
          text-decoration: inherit;
      }
      a:hover {
          text-decoration: underline;
      }
    -->
    </style>
  </head>
  <body>
    <pre>
      <span class="org-document-info-keyword">#+Date:</span> <span class="org-document-info">&lt;2015-08-23 Sun&gt;
      </span>
      <span class="org-level-1">* hello world</span>

      Vivamus id enim.  

    </pre>
  </body>
</html>

Existe uma ferramenta no linux que pode facilmente fazer isso?

    
por Brian Fitzpatrick 24.08.2015 / 08:30

1 resposta

2

Provavelmente, é melhor escrever algo. Este script não é robusto (não verifica strings vazias, não considera o título desejado em várias linhas, etc.), mas pode ser algo para você começar. Backup antes de começar a fazer qualquer coisa maluca.

#! /bin/bash

FILES="./*.html"
for f in $FILES
do
     grep '.*org-document-title">.*' $f |\
         sed -e 's/.*org-document-title">\([^<]\+\).*/\n/g' |\
         tail -n 1 |\
         xargs -I new_title sed -i.bak 's/<title>[^>]\+<\/title>/<title>new_title<\/title>/g' $f
done

Isso só substitui o título pelo novo my desired title . Você poderia expandir fazendo outra passagem e se livrando dos elementos span indesejados.

    
por 24.08.2015 / 12:04