GNU/Linux >> Linux Esercitazione >  >> Linux

Uno script gawk per convertire virgolette intelligenti

Gestisco un sito web personale e modifico le pagine web a mano. Dal momento che non ho molte pagine sul mio sito, questo funziona bene per me, permettendomi di "grattare il prurito" di entrare nel codice del sito.

Il terminale Linux

  • I 7 migliori emulatori di terminale per Linux
  • 10 strumenti da riga di comando per l'analisi dei dati in Linux
  • Scarica ora:cheat sheet SSH
  • Cheat sheet sui comandi avanzati di Linux
  • Esercitazioni sulla riga di comando di Linux

Quando ho aggiornato di recente il design del mio sito web, ho deciso di trasformare tutte le virgolette semplici in "virgolette intelligenti" o citazioni che assomigliano a quelle utilizzate nel materiale di stampa:"" invece di "".

La modifica manuale di tutte le virgolette richiederebbe troppo tempo, quindi ho deciso di automatizzare il processo di conversione delle virgolette in tutti i miei file HTML. Ma farlo tramite uno script o un programma richiede una certa intelligenza. Lo script deve sapere quando convertire una citazione semplice in una citazione intelligente e quale citazione utilizzare.

Puoi usare diversi metodi per convertire le virgolette. Greg Pittman ha scritto uno script Python per correggere le virgolette intelligenti nel testo. Ho scritto il mio in GNU awk (gawk).

Ottieni il nostro cheat sheet awk. Download gratuito.

Per iniziare, ho scritto una semplice funzione gawk per valutare un singolo carattere. Se quel carattere è una virgoletta, la funzione determina se deve produrre una virgoletta semplice o una virgoletta intelligente. La funzione esamina il carattere precedente; se il carattere precedente è uno spazio, la funzione emette una virgoletta intelligente a sinistra. In caso contrario, la funzione emette una virgoletta intelligente corretta. Lo script fa lo stesso per le virgolette singole.

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);
                }
        }
}

Con quella funzione, il corpo dello script gawk elabora il file di input HTML carattere per carattere. Lo script stampa tutto il testo alla lettera quando si trova all'interno di un tag HTML (ad esempio, <html lang="en"> . Al di fuori di qualsiasi tag HTML, lo script utilizza smartquote() funzione per stampare il testo. Lo smartquote() la funzione fa il lavoro di valutare quando stampare virgolette semplici o virgolette intelligenti.

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");
}

Ecco un esempio:

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

Input campione:

<!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>

Risultato di esempio:

<!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. Come eseguire il debug di uno script Bash?

  2. Timeout in uno script di shell?

  3. Caratteri jolly all'interno delle citazioni?

  4. Come aggiungere nuove righe nelle variabili in Bash Script?

  5. Script contro una riga?

Sostituisci le virgolette intelligenti con il comando sed di Linux

35 Esempi di script Bash

Come eseguire uno script Bash

Verifica che uno script sia in esecuzione?

Converti i dati binari in esadecimali in uno script di shell

Aggiungi virgolette doppie attorno ai campi nell'output dello script AWK?