GNU/Linux >> Tutoriels Linux >  >> Linux

Un script gawk pour convertir des guillemets intelligents

Je gère un site Web personnel et j'édite les pages Web à la main. Comme je n'ai pas beaucoup de pages sur mon site, cela fonctionne bien pour moi, me permettant de "gratter la démangeaison" d'entrer dans le code du site.

Le Terminal Linux

  • Les 7 meilleurs émulateurs de terminaux pour Linux
  • 10 outils de ligne de commande pour l'analyse de données sous Linux
  • Télécharger maintenant :Aide-mémoire SSH
  • Aide-mémoire des commandes Linux avancées
  • Tutoriels de ligne de commande Linux

Lorsque j'ai récemment mis à jour la conception de mon site Web, j'ai décidé de transformer toutes les citations simples en "citations intelligentes", ou des citations qui ressemblent à celles utilisées dans les documents imprimés :"" au lieu de "".

Éditer toutes les citations à la main prendrait trop de temps, j'ai donc décidé d'automatiser le processus de conversion des citations dans tous mes fichiers HTML. Mais le faire via un script ou un programme nécessite une certaine intelligence. Le script doit savoir quand convertir un guillemet simple en guillemet intelligent et quel guillemet utiliser.

Vous pouvez utiliser différentes méthodes pour convertir les devis. Greg Pittman a écrit un script Python pour corriger les guillemets intelligents dans le texte. J'ai écrit le mien en GNU awk (gawk).

Obtenez notre aide-mémoire awk. Téléchargement gratuit.

Pour commencer, j'ai écrit une simple fonction gawk pour évaluer un seul caractère. Si ce caractère est un guillemet, la fonction détermine si elle doit afficher un guillemet simple ou un guillemet intelligent. La fonction regarde le caractère précédent; si le caractère précédent est un espace, la fonction génère un guillemet intelligent gauche. Sinon, la fonction génère une citation intelligente droite. Le script fait de même pour les guillemets simples.

function smartquote (char, prevchar) {
        # print smart quotes depending on the previous character
        # otherwise just print the character as-is

        if (prevchar ~ /\s/) {
                # prev char is a space
                if (char == "'") {
                        printf("‘");
                }
                else if (char == "\"") {
                        printf("“");
                }
                else {
                        printf("%c", char);
                }
        }
        else {
                # prev char is not a space
                if (char == "'") {
                        printf("’");
                }
                else if (char == "\"") {
                        printf("”");
                }
                else {
                        printf("%c", char);
                }
        }
}

Avec cette fonction, le corps du script gawk traite le fichier d'entrée HTML caractère par caractère. Le script imprime tout le texte textuellement à l'intérieur d'une balise HTML (par exemple, <html lang="en"> . En dehors de toute balise HTML, le script utilise le smartquote() fonction d'impression de texte. Le smartquote() La fonction se charge d'évaluer quand imprimer des guillemets simples ou des guillemets intelligents.

function smartquote (char, prevchar) {
        ...
}

BEGIN {htmltag = 0}

{
        # for each line, scan one letter at a time:

        linelen = length($0);

        prev = "\n";

        for (i = 1; i <= linelen; i++) {
                char = substr($0, i, 1);

                if (char == "<") {
                        htmltag = 1;
                }

                if (htmltag == 1) {
                        printf("%c", char);
                }
                else {
                        smartquote(char, prev);
                        prev = char;
                }

                if (char == ">") {
                        htmltag = 0;
                }
        }

        # add trailing newline at end of each line
        printf ("\n");
}

Voici un exemple :

gawk -f quotes.awk test.html > test2.html

Exemple d'entrée :

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Test page</title>
  <link rel="stylesheet" type="text/css" href="https://opensource.com/test.css" />
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" />
</head>
<body>
  <h1><a href="https://opensource.com/"><img src="https://opensource.com/logo.png" alt="Website logo" /></a></h1>
  <p>"Hi there!"</p>
  <p>It's and its.</p>
</body>
</html>

Exemple de sortie :

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Test page</title>
  <link rel="stylesheet" type="text/css" href="https://opensource.com/test.css" />
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" />
</head>
<body>
  <h1><a href="https://opensource.com/"><img src="https://opensource.com/logo.png" alt="Website logo" /></a></h1>
  <p>&ldquo;Hi there!&rdquo;</p>
  <p>It&rsquo;s and its.</p>
</body>
</html>


Linux
  1. Comment déboguer un script bash ?

  2. Expiration du délai dans un script shell ?

  3. Caractères génériques à l'intérieur des guillemets ?

  4. Vérifier qu'un script est en cours d'exécution ?

  5. Comment ajouter des nouvelles lignes dans des variables dans un script bash ?

Remplacez les guillemets intelligents par la commande Linux sed

35 exemples de scripts bash

Comment exécuter un script bash

Comment convertir .. dans les noms de chemin en nom absolu dans un script bash ?

Ajouter des guillemets autour des champs dans la sortie du script AWK ?

Comment laisser l'utilisateur exécuter une commande contenant des guillemets dans sudoers ?