我正在尝试编写一个批处理文件来自动执行某些Pascal源代码的批量编辑。我的源文件偶尔有这样的一行:
//{## identifier} Inc (Index) ; { a comment } // another comment
而且我想将它们全部更改为:
{$ifdef identifier} Inc (Index) ; { a comment } // another comment {$endif}
下面是我正在使用的测试批处理文件。
:: File TestRXRepl.bat
:: ===================
@echo //{## identifier} Inc (Index) ; { a comment } // another comment >t.pas
@set "FindRegExp=(\ *)\/\/\{\#\#\ *([a-z,0-9,_]+)\}(\ *)(.*)"
@set "ReplRegExp=\1{$ifdef \2}\3\4 {$endif}"
rxrepl --file t.pas --output t.out --search "%FindRegExp%" --replace "%ReplRegExp%"
@type t.pas
@type t.out
正则表达式应该:
//{##
}
除行尾处理外,所有工作正常。第4组应该捕获从源代码行的开始到行尾的所有内容,但似乎include行尾,结果是{endif}
被写入下一行,即我得到:
{$ifdef identifier} Inc (Index) ; { a comment } // another comment
{$endif}
而不是:
{$ifdef identifier} Inc (Index) ; { a comment } // another comment {$endif}
我正在使用的工具是RXRepl。它有一个选项--eol
,听起来似乎很有用,但我无法通过使用它来改变其行为。
((注))
欢迎提出使它更优雅的建议,以及使之正常工作的建议。
问题似乎是您的.
与换行符匹配,这意味着PCRE2_DOTALL选项有效。 (我不知道为什么会这样,rxrepl
可能始终默认设置该选项。)
一种可能的解决方法是,使用(.*\S)
来匹配正则表达式中的第4组与\S
character type的匹配,该匹配将匹配所有非空格字符,并排除换行符。
但是解决此问题的最佳方法可能是使用\S
,在手册中将其描述为:
当未设置the
\N
sequence时,\N
转义序列与“\N
”元字符具有相同的含义,但设置.
不会更改PCRE2_DOTALL
的含义。
因此,只需将您比赛中的第4组使用PCRE2_DOTALL
,就会匹配当前匹配的所有内容,但结尾的换行符除外。
在您的脚本中,只需更新此行:
\N