我正在编写一个 bash 脚本,需要从 Lua 文件中删除注释,其格式为:
--like this
foo="bar" --or like this
--[[ or like this ]]
--[[
or
like
this
]]
我知道我可以用来sed 's/--.*$//' ${my_file}
删除单行注释,但是如何解决多行注释呢?
谢谢!
答案1
不,这并不是正则表达式引擎的工作。例如,您可以在字符串中完全合法地拥有--
或。]]
字符串以 结尾"
,但不以 结尾\"
。
编程语言的思想并不容易映射(在某些情况下,根本不是,但这成为语法理论的练习)到正则表达式。
我自己不是语言理论家,但我认为 lua 可能没有定义正则语法,因此可能无法被正则表达式解析。
实现这一点的方法是构建一个词法分析器,它逐个字符地读取文件,并将它们分为代币(例如,这是一个字符串标记,当您看到 a 时开始"
,当您看到未转义的 时结束"
)。您发出所有令牌不是评论。
答案2
假设所有多行匹配都以 开头--[[
和结尾]]
,您可以使用范围匹配来处理多行和单行匹配。
$ 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