【问题标题】:sed replace (single-line) C comments with C++ commentssed 用 C++ 注释替换(单行)C 注释
【发布时间】:2012-07-28 15:21:12
【问题描述】:

如何使用 sed 将源文件中的所有 C 样式 cmets 替换为 C++ 样式。

所有这些:

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

到:

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

所有 cmets 都是单行代码,中间没有这样的代码:

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

所以我尝试了这个:

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

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

【问题讨论】:

  • 这是我第一次听到“C cmets”和“C++ cmets”的名字

标签: regex sed


【解决方案1】:
sed -i 's:\(.*\)/[*]\(.*\)[*]/:\1 // \2:' FILE

这将像这样转换每一行:

aaa  /* test */

变成这样的一行:

aaa  // test

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

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

进入

aaa  bbb ccc // c1 c2

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

一个更复杂的情况是当您在一行的字符串中包含 cmets 时,例如在 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-cmets.sed 中,然后这样调用它:

sed -i -f c-comments.sed FILE

【讨论】:

  • 它是一个分隔符。命令 's' 之后的下一个字符称为分隔符,可以是任何字符。例如,如果我需要替换的字符串包含“/”,那么插入“/”作为分隔符是不好的,因为在这种情况下,我必须用反斜杠引用“/”。在这种情况下,我使用了 ':'
猜你喜欢
  • 2011-10-27
  • 2010-10-07
  • 2018-09-06
  • 2014-09-29
  • 2017-11-16
  • 2021-07-12
  • 2012-08-13
  • 1970-01-01
  • 2010-12-18
相关资源
最近更新 更多