ridgek Asked: 2021-11-26 02:07:00 +0800 CST2021-11-26 02:07:00 +0800 CST 2021-11-26 02:07:00 +0800 CST 如何删除 bash 脚本中的多行 (Lua) 注释? 772 我正在编写一个 bash 脚本,我需要从 Lua 文件中删除注释,这些文件的格式如下: --like this foo="bar" --or like this --[[ or like this ]] --[[ or like this ]] 我知道我可以用它sed 's/--.*$//' ${my_file}来删除单行注释,但我怎样才能解决多行注释呢? 谢谢! bash sed 2 个回答 Voted Marcus Müller 2021-11-26T02:43:11+08:002021-11-26T02:43:11+08:00 不,不是正则表达式引擎的真正工作。例如,您可以拥有--或]]完全合法地使用字符串。字符串以 结尾",但不以结尾\"。 编程语言的概念并不容易(在某些情况下,根本不是,但这成为语法理论中的一个练习)映射到正则表达式。 我自己不是语言理论家,但我认为 lua 可能没有定义常规语法,因此可能不是正则表达式可解析的。 实现这一点的方法是构建一个词法分析器,它逐个字符地读取文件,并将它们分成标记(例如,这是一个字符串标记,当你看到 a 时开始,"看到未转义时结束")。您发出所有不是评论的令牌。 Best Answer HatLess 2021-11-26T02:42:11+08:002021-11-26T02:42:11+08:00 假设所有多行匹配都以 开头--[[和结尾]],您可以使用范围匹配来处理多行匹配和单行匹配。 $ sed '/^--\[\[/,/\]\]/d' input_file --like this foo=bar --or like this 实现您的原始代码现在可以清除与上一个命令不匹配的剩余注释。 $ sed '/^--\[\[/,/\]\]/d;s/--.*$//' input_file foo=bar 要清理,也可以删除空行。 $ sed '/^--\[\[/,/\]\]/d;s/--.*//;/^$/d' input_file foo=bar
不,不是正则表达式引擎的真正工作。例如,您可以拥有
--
或]]
完全合法地使用字符串。字符串以 结尾"
,但不以结尾\"
。编程语言的概念并不容易(在某些情况下,根本不是,但这成为语法理论中的一个练习)映射到正则表达式。
我自己不是语言理论家,但我认为 lua 可能没有定义常规语法,因此可能不是正则表达式可解析的。
实现这一点的方法是构建一个词法分析器,它逐个字符地读取文件,并将它们分成标记(例如,这是一个字符串标记,当你看到 a 时开始,
"
看到未转义时结束"
)。您发出所有不是评论的令牌。假设所有多行匹配都以 开头
--[[
和结尾]]
,您可以使用范围匹配来处理多行匹配和单行匹配。实现您的原始代码现在可以清除与上一个命令不匹配的剩余注释。
要清理,也可以删除空行。