閉じ括弧がない行を検索する

閉じ括弧がない行を検索する

これを行う簡単な方法はありますか? 理想的には、括弧がない行に閉じ括弧を追加します。 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

問題を解決するためにいくつかのプログラムを依頼しました。2 つは Java プログラムです。1 つは Javascript プログラムです。もう 1 つは Python スクリプトです。こちらがリンクです: https://www12.zippyshare.com/v/9f8cIYpY/file.html

Javascript と Python のプログラムは私の場合はうまくいきました。Java ファイルでうまくいくかどうかは、修正しようとしているファイルの性質によって異なります。私のファイルでは、同じ行に 2 つの URL が含まれることがあり、これが Java プログラムの動作を妨げていました。

これが、@henrimenke が提案した lua スクリプトが機能しなかった理由かもしれません。

関連情報