Suchen Sie nach Zeilen ohne schließende Klammern

Suchen Sie nach Zeilen ohne schließende Klammern

Gibt es eine einfache Möglichkeit, dies zu tun? Idealerweise würde der Zeile, in der die Klammer fehlt, eine schließende Klammer hinzugefügt. Gibt es eine SED/AWK-Antwort?

Einige Zeilen lauten:

\url{http://google.com}

Während andere:

\url{http://google.com

Ich möchte den Zeilen, die eine öffnende Klammer enthalten, aber keine schließende Klammer haben, eine schließende Klammer hinzufügen.

%%%%% Die Quelldatei:

%\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}

Antwort1

Sie können in Lua mit LPEG eine Analyse schreiben, die mit ausgeglichenen Klammern übereinstimmt. Beachten Sie, dass dies zeilenbasiert ist. Wenn Sie also Konstrukte haben, bei denen die Klammern mehrere Zeilen umfassen, schlägt dies fehl.

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}

Das Ausführen mit texluagibt

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

Es ist auch möglich, automatisch eine schließende Klammer an die fehlerhafte Zeile anzufügen. Zu diesem Zweck analysieren wir die Zeile und fügen, wenn dies fehlschlägt, am Ende Klammern hinzu, bis es klappt.

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

Es gibt einige offensichtliche Einschränkungen bei diesem Ansatz, nämlich dass die Maschine nicht wissen kannwo genaudie schließende Klammer muss gesetzt werden.

test2.tex

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

Das Ausführen gegen das obige Beispiel ergibt eine syntaktisch korrekte, aber semantisch falsche Ausgabe:

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

Dies lässt sich nicht automatisiert beheben. Nur der Benutzer kann wissen, wo die schließende Klammer platziert werden muss, damit sie semantisch korrekt ist.

Antwort2

Ich habe mehrere Programme in Auftrag gegeben, um das Problem zu beheben. Zwei davon sind Java-Programme. Eines ist ein Javascript-Programm. Das andere ist ein Python-Skript. Hier ist ein Link: https://www12.zippyshare.com/v/9f8cIYpY/file.html

Bei mir funktionierten die Javascript- und Python-Programme. Ihr Erfolg mit den Java-Dateien hängt von der Art der Datei ab, die Sie reparieren möchten. Meine Datei hatte manchmal zwei URLs in derselben Zeile, was dazu führte, dass die Java-Programme blockierten.

Dies könnte der Grund gewesen sein, warum das von @henrimenke vorgeschlagene Lua-Skript bei mir nicht funktioniert hat.

verwandte Informationen