我正在尝试将单行“C”样式注释转换为“C++”样式。下面的“sed”还不错,但是如果任何前导代码(注释之前的代码)中包含任何“/”,它当然会失败:
sed -i 's,\(^[^\/]*\)\/\*\([^\*]*\)\*\/[ ]*$,\1\/\/\2,' filename
Run Code Online (Sandbox Code Playgroud)
我希望我能做的是:
... [^\\/\\*] ...
Run Code Online (Sandbox Code Playgroud)
即否定' /* '当然不起作用,但是经过几个小时的搜索,我找不到如何正确执行此操作的简单解释:(这似乎不应该是火箭科学。
例如,这些字符串:
blah blah /* comment */
blah blah / blah /* comment */
blah blah /* comment */ blah
blah blah / blah /* comment */ blah
Run Code Online (Sandbox Code Playgroud)
...应该这样转换:
blah blah // comment
blah blah / blah // comment
blah blah /* comment */ blah (this CAN'T be converted)
blah blah / blah /* comment */ blah (this CAN'T be converted)
Run Code Online (Sandbox Code Playgroud)
...显然,如果在“C”注释之后有代码,则无法进行转换。
我将在文件前后进行密切的视觉比较,因此无需在文字中处理“ /* ”,也不想转换任何多行内容。
注意我认为这是一个“否定”问题,但也许还有另一种方法。我只需要在“ /* ”之前捕获所有内容,我不在乎如何。
好该死!我发现我完全误解了一些基本的东西:
.*/\*
Run Code Online (Sandbox Code Playgroud)
... 读作:“除了斜线星和斜线星之外的任何东西”,所以实际上我免费得到我的“否定”:-)
因此,比 Barmar 走得更远:
sed -i 's,^\(.*\)/\*\(.*\)\*/\s*$,\1//\2,' filename
Run Code Online (Sandbox Code Playgroud)
......甚至会抓住这个:
blah / * blah /* co / mme * nt */
Run Code Online (Sandbox Code Playgroud)
并输出这个:
blah / * blah // co / mme * nt
Run Code Online (Sandbox Code Playgroud)
启示。
尝试这个:
sed 's,^\(.*\)/\*\([^/]*\)\*/$,\1//\2,'
Run Code Online (Sandbox Code Playgroud)
这不会转换包含嵌入/字符的注释。或者,您可以使用:
sed 's,^\(.*\)/\*\(.*\)\*/$,\1//\2,'
Run Code Online (Sandbox Code Playgroud)
如果同一行有两个注释,这会做错误的事情,例如
blah blah /* comment1 */ blah /* comment2 */
Run Code Online (Sandbox Code Playgroud)
将转换为
blah blah // comment1 */ blah /* comment2
Run Code Online (Sandbox Code Playgroud)
使用 PCRE 版本可能会做得更好sed,因为您可以使用负前瞻来测试嵌入的注释。
另请注意,,在命令中用作分隔符s意味着您不必转义/正则表达式中的所有字符——这就是/当正则表达式包含大量/.