使用 sed 将 C 风格的注释转换为 C++ 风格

Ray*_*ews 6 sed

我正在尝试将单行“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)

启示。

Bar*_*mar 4

尝试这个:

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意味着您不必转义/正则表达式中的所有字符——这就是/当正则表达式包含大量/.