尋找缺少右大括號的行

尋找缺少右大括號的行

是否有捷徑可尋?理想情況下,應將右括號添加到缺少括號的行中。有 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 腳本不適合我的原因。

相關內容