GNU/Linux >> Linux の 問題 >  >> Linux

スマートクォートを変換するgawkスクリプト

私は個人のウェブサイトを管理し、ウェブページを手作業で編集しています。私のサイトには多くのページがないので、これは私にとってうまく機能し、サイトのコードに入る「かゆみを掻く」ことができます。

Linuxターミナル

  • Linux用の上位7つのターミナルエミュレータ
  • Linuxでのデータ分析のための10個のコマンドラインツール
  • 今すぐダウンロード:SSHチートシート
  • 高度なLinuxコマンドのチートシート
  • Linuxコマンドラインチュートリアル

最近ウェブサイトのデザインを更新したとき、すべてのプレーンな引用を「スマートな引用」、つまり印刷物で使用されているような引用に変換することにしました。「」ではなく「」です。

すべての引用符を手動で編集するには時間がかかりすぎるため、すべてのHTMLファイルの引用符を変換するプロセスを自動化することにしました。ただし、スクリプトまたはプログラムを介してこれを行うには、ある程度のインテリジェンスが必要です。スクリプトは、プレーンクォートをスマートクォートに変換するタイミングと、使用するクォートを知る必要があります。

さまざまな方法を使用して、見積もりを変換できます。 Greg Pittmanは、テキスト内のスマート引用符を修正するためのPythonスクリプトを作成しました。私はGNUawk(gawk)で書いた。

awkのチートシートを入手してください。無料ダウンロード。

まず、1つの文字を評価する簡単なgawk関数を作成しました。その文字が引用符である場合、関数は、単純引用符を出力するか、スマート引用符を出力するかを決定します。関数は前の文字を調べます。前の文字がスペースの場合、関数は左のスマート引用符を出力します。それ以外の場合、関数は正しいスマートクォートを出力します。スクリプトは一重引用符に対しても同じことを行います。

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

この関数を使用すると、gawkスクリプトの本体がHTML入力ファイルを1文字ずつ処理します。スクリプトは、HTMLタグ内にある場合、すべてのテキストを逐語的に出力します(たとえば、<html lang="en"> 。 HTMLタグの外部では、スクリプトはsmartquote()を使用します テキストを印刷する関数。 smartquote() 関数は、プレーンクォートまたはスマートクォートをいつ印刷するかを評価する作業を行います。

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

次に例を示します:

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

サンプル入力:

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

サンプル出力:

<!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. Bashスクリプトの変数に改行を追加する方法は?

  2. ワンライナー対スクリプト?

  3. 期待スクリプトで使用するために特殊文字でパスワードを変換しますか?

  1. AWK 対 NAWK 対 GAWK

  2. Linux OS サービス「scsi_reserve」

  3. MacOS のシェルスクリプトで DATE を UNIX TIMESTAMP に変換する方法

  1. シェル スクリプトでバイナリ データを 16 進数に変換する

  2. パス名の .. を bash スクリプトの絶対名に変換する方法は?

  3. AWK スクリプト出力のフィールドを二重引用符で囲みますか?