Visual Studio Code で,正規表現を使って文章を成形するタスクを作成する

ChatGPT が出力した HTML を,Anki の穴埋め問題のテキストとして利用しようとすると,テキストの前後にたくさんの HTML タグがあることがわかります。そもそもそれを避けてコピーすればよいのかもしれませんが,それも面倒な作業ですので,取り込んだ HTML を,正規表現を使って掃除しています。しかし,毎日何度もその作業をしなければならないので,いい加減スクリプトを組もうと思い立ちました。

ところが,その作業に思いのほか手間取ったので,ようやくうまくいったところで,備忘録を兼ねてこちらに作業の内容をまとめておきたいと思います。私と同じように,VS Code で正規表現を使って文章を成形する作業を自動化したい人の,助けになればと思っています。

VS Code でスクリプトを組むには

VS Code では,一般的に言う「スクリプト」は「タスク」と呼ばれています。VS Code を開き,「ターミナル」メニューから「タスクの実行」を選びます。初めての実行の場合,「テンプレートから tasks.json ファイルを作成する」,という趣旨のメニューがあると思いますので,それを選んで作成を開始します。この場合,tasks.json は,VS Code の Users フォルダ直下に作られ,全プロジェクトで横断的に使える,グローバルなスクリプトとなるようです。

tasks.json に,書式に従ってタスクを書いていきます。以下は私が作成したタスクです。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "ChatGPT HTML Cleaner", // 名前を決めます。
            "type": "shell", // シェルで実行されることを宣言します。
            "command": "sed", // コマンド名です。
            "args": [ // 引数を決めます。
                "-i", // ファイルへのアクセスを許可します。
                "-r", // 拡張正規表現の使用を宣言します。必ず,正規表現パターンの直前に,このオプションを置きます。
                "'s/<p>/<FirstPOpenTag>/; s/\\(.*\\)<\\/p>/\\1<FinalPCloseTag>/; s/.*<FirstPOpenTag>/<p>/; s/<FinalPCloseTag>.*/<\\/p>/'", 
                // シングルクォーテーションマークで囲います。
                // 正規表現を複数使う場合は,シングルクォーテーションを句切らずに,; でつなぎます。
                // グループ化の () は,エスケープ文字が必要ですが,この json ファイルがさらにエスケープを求めるので,\\( \\) となります。
                "${file}"
            ],
            "problemMatcher": []
        }
    ]
}

コード内にも註釈を書きましたが,ハマったポイントをいくつか書いておきます。

正規表現を,シングルクォーテーションマーク等でくくること

くくらなくても動くので,最初ハマりました。VS Code のコンソールで実行されている様子を見ればわかることなのですが,正規表現をシングルクォーテーションマークでくくる必要があります。ですから "'正規表現'" というように,正規表現部分はシングルとダブルの両方のクォーテーションマークで囲まれることになります。

また,オプションの選択順序も,-r -i の順では動きません。-i -r の順にしてください。

MacOS の sed コマンドのグループ化には,エスケープ文字が必要

ここから先は MacOS の sed コマンドが原因となっている問題で,一番の解決策は MacOS 用に gsed をインストールすることでしたが,gsed をインストールする前に私がどうしていたかを書いておこうと思います。

ここは二重にハマりました。グループ化するときに括弧でくくる部分ですが,sed コマンドではこの括弧にエスケープ処理が必要なのだそうです。ですから,(グループ) ではなく,\(グループ\)とする必要があります。しかし,VS Code のタスクからバックスラッシュを出力すること自体にもエスケープ処理が必要となるため,json ファイル上の表記が \\(グループ\\) となります。

さらに,置換結果へのグループの貼り付けですが,sed コマンドでは $1 ではなく \1 と書くようです。この \1 にも当然エスケープ処理が必要ですので,\\1 となります。

最短一致が使えない

これは VS Code ではなく MacOS の sed コマンドの制限の話ですが,最短一致を表す ? が使えません。そこで,最初の <p> タグをいったん <FirstPOpenTag> と改名させることにしました。最後の </p> タグよりも後ろの部分も削除したいので,こちらは <FinalPCloseTag> といったん改名してから,削除の処理に移ることにしました。</p> よりも後ろの部分の削除は,このステップを踏まなくても大丈夫ですが,前半と処理を合わせました。

あとは,セミコロンを使って,処理を書き足していくだけです。

gsed をインストールしましょう

MacOS 用の GNU 版 sed をインストールするのが無難です。インストール方法については,たくさんの記事がありますので,検索してみてください。


コメント

“Visual Studio Code で,正規表現を使って文章を成形するタスクを作成する” への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です