GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ein Gawk-Skript zum Konvertieren von intelligenten Anführungszeichen

Ich verwalte eine persönliche Website und bearbeite die Webseiten von Hand. Da ich nicht viele Seiten auf meiner Website habe, funktioniert dies gut für mich und lässt mich „den Juckreiz kratzen“, in den Code der Website zu gelangen.

Das Linux-Terminal

  • Die 7 besten Terminalemulatoren für Linux
  • 10 Befehlszeilentools für die Datenanalyse unter Linux
  • Jetzt herunterladen:SSH-Spickzettel
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Linux-Befehlszeilen-Tutorials

Als ich kürzlich das Design meiner Website aktualisiert habe, habe ich mich entschieden, alle einfachen Anführungszeichen in „intelligente Anführungszeichen“ umzuwandeln, oder Anführungszeichen, die wie die in Drucksachen verwendeten aussehen:„“ anstelle von „“.

Alle Zitate von Hand zu bearbeiten würde zu lange dauern, also habe ich mich entschieden, den Konvertierungsprozess der Zitate in allen meinen HTML-Dateien zu automatisieren. Aber dies über ein Skript oder Programm zu tun, erfordert etwas Intelligenz. Das Skript muss wissen, wann ein einfaches Zitat in ein intelligentes Zitat umgewandelt werden soll und welches Zitat verwendet werden soll.

Sie können verschiedene Methoden verwenden, um Zitate umzuwandeln. Greg Pittman hat ein Python-Skript zum Korrigieren von intelligenten Anführungszeichen in Text geschrieben. Ich habe meine in GNU awk (gawk) geschrieben.

Holen Sie sich unseren awk-Spickzettel. Kostenloser Download.

Zu Beginn habe ich eine einfache gawk-Funktion geschrieben, um ein einzelnes Zeichen auszuwerten. Wenn dieses Zeichen ein Anführungszeichen ist, bestimmt die Funktion, ob es ein einfaches Anführungszeichen oder ein intelligentes Anführungszeichen ausgeben soll. Die Funktion betrachtet das vorherige Zeichen; Wenn das vorherige Zeichen ein Leerzeichen ist, gibt die Funktion ein linkes intelligentes Anführungszeichen aus. Andernfalls gibt die Funktion ein richtiges intelligentes Zitat aus. Das Skript macht dasselbe für einfache Anführungszeichen.

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

Mit dieser Funktion verarbeitet der Körper des gawk-Skripts die HTML-Eingabedatei zeichenweise. Das Skript gibt den gesamten Text wörtlich aus, wenn er sich in einem HTML-Tag befindet (z. B. <html lang="en"> . Außerhalb von HTML-Tags verwendet das Skript smartquote() Funktion zum Drucken von Text. Das smartquote() Die Funktion erledigt die Arbeit, um auszuwerten, wann einfache Anführungszeichen oder intelligente Anführungszeichen gedruckt werden sollen.

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

Hier ist ein Beispiel:

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

Beispieleingabe:

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

Beispielausgabe:

<!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. Ersetzen Sie intelligente Anführungszeichen durch den Linux-Befehl sed

  2. Wie fügt man Zeilenumbrüche in Variablen im Bash-Skript ein?

  3. Einzeiler vs. Drehbuch?

  4. Passwort mit Sonderzeichen zur Verwendung mit Expect-Skript konvertieren?

  5. Bash \xc3\x89 in É konvertieren?

35 Bash-Skriptbeispiele

Eine Anleitung für Anfänger zum gawk

So führen Sie ein Bash-Skript aus

Linux-Betriebssystemdienst „scsi_reserve“

Wie konvertiert man .. in Pfadnamen in absolute Namen in einem Bash-Skript?

Felder in der AWK-Skriptausgabe in doppelte Anführungszeichen setzen?