Sedでstdinの処理された出力を代替文字列として使用する

Sedでstdinの処理された出力を代替文字列として使用する

次のコマンドは私が望む出力を提供します。

$ sed '/^<template.*>/,/<\/template>/!d;//d' src/components/**/*.vue | html2jade

HTMLを含むすべてのテンプレートをそのパグに対応するものとして扱うためです。

これらすべてのファイルで元々見つかったhtmlを現在処理された出力に置き換えることは可能ですか?テンプレートタグの外側には、そのままにする必要がある他のいくつかの項目、つまりsomescriptstyleタグがあります。

ベストアンサー1

私はあなたがこれを行うことができないと思いますsed。これは可能なはずawkですが難しいです。 python3より適切に見えます。

import re
import subprocess
from io import StringIO
from traceback import format_exception_only

PROCESS_COMMAND = ("html2jade",)
TEMPLATE_OPEN_REGEX = re.compile(r"^<template.*>$")
TEMPLATE_CLOSE_REGEX = re.compile(r"^</template>$")

def replace_templates(file_path) :
    out_buffer = StringIO()
    template_buffer = StringIO()

    with open(file_path, "r") as file :
        lines_gen = enumerate(file, 1)
        for (lineno, line) in lines_gen :
            out_buffer.write(line)

            if (TEMPLATE_OPEN_REGEX.match(line)) :
                for (lineno, line) in lines_gen :
                    if (TEMPLATE_OPEN_REGEX.match(line)) :
                        raise ValueError("nested opening tag on line {:d}".format(lineno))
                    elif (TEMPLATE_CLOSE_REGEX.match(line)) :
                        break

                    template_buffer.write(line)
                else :
                    raise ValueError("tag never closed")

                proc = subprocess.run(
                    PROCESS_COMMAND,
                    input=template_buffer.getvalue(),
                    stdout=subprocess.PIPE,
                    stderr=subprocess.DEVNULL,
                    encoding="UTF-8",
                    check=True)

                out_buffer.write(proc.stdout)
                out_buffer.write(line)

                template_buffer.seek(0)
                template_buffer.truncate()
            elif (TEMPLATE_CLOSE_REGEX.match(line)) :
                raise ValueError("closing tag encountered on line {:d}, before opening tag".format(lineno))

    with open(file_path, "w") as file :
        file.write(out_buffer.getvalue())

def main(args) :
    for a in args :
        try :
            replace_templates(a)
        except Exception as ex :
            print("generation failed for file {!r} ({:s})".format(
                 a,
                 format_exception_only(type(ex), ex)[-1].rstrip()))
        else :
            print("file {!r} written".format(a))

if (__name__ == "__main__") :
    from sys import argv

    main(argv[1:])
  • 表示された行のテンプレートコードを無視しているようで、私のコードはそれを処理せずに完全な行一致を実行します。
  • 無効な値このエラーは、Open and Close テンプレートタグの順序が正しくない場合に発生します。
  • ファイルが見つかりませんエラー次の場合に発生します。.vueファイルまたはサブプロセスコマンドが見つかりません。
  • ChildProcess.CalledProcessError子プロセスが0を返さない場合、この例外がスローされます。
  • Unicode デコードエラーこのエラーは、子プロセスがUTF-8以外の文字を出力する場合に発生します。
  • エラーが発生した場合、ファイルはタッチされません。
  • フルファイル出力はRAMにバッファされます。

おすすめ記事