Sed에서 stdin의 처리된 출력을 대체 문자열로 사용

Sed에서 stdin의 처리된 출력을 대체 문자열로 사용

다음 명령은 내가 원하는 출력을 제공합니다.

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

HTML을 포함하는 모든 템플릿을 해당 퍼그에 해당하는 것으로 처리하기 때문입니다.

이 모든 파일에서 원래 발견된 html을 현재 처리된 출력으로 바꾸는 것이 가능합니까? 템플릿 태그 외부에는 그대로 두어야 하는 몇 가지 다른 항목, 즉 some scriptstyle태그가 있습니다.

답변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:])
  • 표시된 줄의 템플릿 코드를 무시하는 것 같아서 내 코드는 이를 처리하지 않고 전체 줄 일치를 수행합니다.
  • 잘못된 값이 오류는 열기 및 닫기 템플릿 태그의 순서가 올바르지 않은 경우 발생합니다.
  • 파일을 찾을 수 없음 오류다음과 같은 경우에 발생합니다..vue파일 또는 하위 프로세스 명령을 찾을 수 없습니다.
  • ChildProcess.CalledProcessError하위 프로세스가 0을 반환하지 않으면 이 예외가 발생합니다.
  • 유니코드 디코딩 오류이 오류는 하위 프로세스가 UTF-8이 아닌 문자를 출력하는 경우 발생합니다.
  • 오류가 발생하면 파일은 터치되지 않습니다.
  • 전체 파일 출력은 RAM에 버퍼링됩니다.

관련 정보