닫는 중괄호가 없는 줄 찾기

닫는 중괄호가 없는 줄 찾기

이 작업을 수행하는 쉬운 방법이 있나요? 이상적으로는 대괄호가 없는 줄에 닫는 대괄호를 추가하는 것이 좋습니다. SED/AWK 답변이 있나요?

일부 줄은 다음과 같습니다.

\url{http://google.com}

다른 사람들은:

\url{http://google.com

여는 중괄호는 포함하지만 닫는 중괄호는 없는 줄에 닫는 중괄호를 추가하고 싶습니다.

%%%%% 소스 파일:

%\usepackage[anythingbreaks]{breakurl}
%\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref}

%\usepackage[hyphens]{url}

\usepackage{url}
\urlstyle{rm}
\makeatletter
\g@addto@macro{\UrlBreaks}{\UrlOrds}
\makeatother


\title{}
\author{}
\date{2019-08-19}
%\sloppy
\begin{document}

답변1

균형 중괄호와 일치하는 LPEG를 사용하여 Lua에서 구문 분석을 작성할 수 있습니다. 이는 줄 기반이므로 중괄호가 여러 줄에 걸쳐 있는 구문이 있는 경우 이 작업은 실패합니다.

test.lua

local lpeg = require("lpeg")
local P, S, V = lpeg.P, lpeg.S, lpeg.V

local function err(match, pos, cap)
    print(match, pos, cap)
end

local rule = P{"text",
    any = 1 - S"{}",
    balanced = "{" * (V"any" + V"balanced")^0 * "}",
    text = V"any" * (V"balanced" + V"any")^0 * P(-1)
}

local path = arg[1] or error("Usage: " .. arg[0] .. " <filename>")
local file = io.open(path, "r")

local n = 1
for line in file:lines() do
    local match = rule:match(line)
    if not match then
        error("Closing } missing on line " .. n)
    end
    n = n + 1
end

test.tex

\documentclass{article}
\usepackage{url}
\begin{document}
\url{http://google.com
\end{document}

texlua이것을 제공 으로 실행

$ texlua test.lua test.tex
test.lua:21: Closing } missing on line 4

문제가 있는 줄에 닫는 중괄호를 자동으로 추가하는 것도 가능합니다. 이를 위해 라인을 구문 분석하고 실패하면 성공할 때까지 끝에 중괄호를 추가합니다.

test2.lua

local lpeg = require("lpeg")
local P, S, V = lpeg.P, lpeg.S, lpeg.V

local function err(match, pos, cap)
    print(match, pos, cap)
end

local rule = P{"text",
    any = 1 - S"{}",
    balanced = "{" * (V"any" + V"balanced")^0 * "}",
    text = V"any" * (V"balanced" + V"any")^0 * P(-1)
}

local path = arg[1] or error("Usage: " .. arg[0] .. " <filename>")
local file = io.open(path, "r")

for line in file:lines() do
    local match
    while not match do
        match = rule:match(line)
        if not match then
            line = line .. "}"
        end
    end
    print(line)
end

이 접근 방식에는 몇 가지 명백한 제한 사항이 있습니다. 즉, 기계가 알 수 없다는 것입니다.정확히 어디에닫는 중괄호를 배치해야 합니다.

test2.tex

\documentclass{article}
\usepackage{url}
\begin{document}
Use \url{http://google.com to reach Google search
\end{document}

위의 예를 실행하면 구문적으로는 정확하지만 의미적으로는 잘못된 출력이 제공됩니다.

$ texlua test2.lua test2.tex
\documentclass{article}
\usepackage{url}
\begin{document}
Use \url{http://google.com to reach Google search}
\end{document}

이 문제는 자동화된 접근 방식을 사용하여 해결할 수 없습니다. 의미상 올바른 닫는 중괄호를 배치해야 하는 위치는 사용자만이 알 수 있습니다.

답변2

문제를 해결하기 위해 여러 프로그램을 의뢰했습니다. 두 개는 Java 프로그램입니다. 하나는 자바스크립트 프로그램이다. 다른 하나는 Python 스크립트입니다. 다음은 링크입니다: https://www12.zippyshare.com/v/9f8cIYpY/file.html

Javascript와 Python 프로그램이 저에게 효과적이었습니다. Java 파일의 행운은 수정하려는 파일의 성격에 따라 달라집니다. 내 파일에는 때때로 같은 줄에 두 개의 URL이 있었고 이로 인해 Java 프로그램이 중단되었습니다.

이것이 @henrimenke가 제안한 lua 스크립트가 나에게 작동하지 않는 이유일 수 있습니다.

관련 정보