regex - sed 用 C++ 注释替换(单行)C 注释

标签 regex sed

如何使用 sed 将源文件中的所有 C 风格注释替换为 C++ 风格。

所有这些:

int main() {
  /* some comments */
  ...

至:

int main() {
  // some comments
  ...

所有注释都是单行,并且代码之间没有像这样的注释:

int f(int x /*x-coordinate*/ );

所以我尝试了这个:

 sed -i 's/ \/\* .*  \*\ / \/\/* /g' src.c

但它使文件保持不变。 This帖子类似,但我试图理解 sed 的表达式语法。自从 ”。”匹配任何字符,“* ”匹配零个或多个某种模式。我假设“.*”匹配任意数量的任意字符。

最佳答案

sed -i 's:\(.*\)/[*]\(.*\)[*]/:\1 // \2:' FILE

这将像这样转换每一行:

aaa  /* test */

像这样的一行:

aaa  // test

如果同一行有更多注释,您可以应用这个更复杂的解析器,它可以将行转换为:

aaa /* c1 */ bbb /* c2 */ ccc

进入

aaa  bbb ccc // c1 c2
<小时/>
sed -i ':r s:\(.*\)/[*]\(.*\)[*]/\(.*\):\1\3 //\2:;tr;s://\(.*\)//\(.*\)://\2\1:;tr' FILE

更复杂的情况是当您在一行字符串中添加注释时,例如 call("/*string*/") 中。这是一个脚本c-comments.sed,用于解决这个问题:

s:\(["][^"]*["]\):\n\1\n:g
s:/[*]:\n&:g
s:[*]/:&\n:g
:r
s:["]\([^\n]*\)\n\([^"]*\)":"\1\2":g
tr
:x
s:\(.*\)\n/[*]\([^\n]*\)[*]/\n\(.*\)$:\1\3 // \2:
s:\(.*\)\n\(.*\)//\(.*\)//\(.*\):\1\n\2 //\4\3:
tx
s:\n::g

将此脚本保存到文件 c-comments.sed 中,并按如下方式调用它:

sed -i -f c-comments.sed FILE

关于regex - sed 用 C++ 注释替换(单行)C 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11730287/

相关文章:

linux - Unix 字符串在文件中查找和替换

linux - 替换文件中的未知行linux命令

python - 正则表达式lookbehind和lookahead未找到任何匹配项

regex - 如何在 tcl 中使用正则表达式提取数组索引

regex - .htaccess 强制服务器添加尾部斜杠,带有扩展的链接除外

javascript - 如何在空格而不是引号之间拆分?

java - 从正则表达式中排除括号内的字符串?

regex - 删除 2 个匹配模式之间的 n 行,保留第一个匹配项并删除第二个匹配项

regex - 删除 key :value pair from json file using shell script

linux - 使用 Sed 替换下一行但保留空格