查找缺少右括号的行

查找缺少右括号的行

有没有简单的方法可以做到这一点?理想情况下,应该在缺少括号的行中添加一个右括号。有 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 程序。一个是 Javascript 程序。另一个是 Python 脚本。以下是链接: https://www12.zippyshare.com/v/9f8cIYpY/file.html

Javascript 和 Python 程序对我来说很管用。Java 文件的运气取决于您要修复的文件的性质。我的文件有时在同一行有两个 URL,这导致 Java 程序卡住。

这可能是@henrimenke 提出的 lua 脚本对我来说不起作用的原因。

相关内容