忽略C注释并使用sed(//,/ **,** /,#)包含语句

时间:2018-09-29 21:31:24

标签: regex shell sed

所以我有一些示例C代码

/**
example text
**/
#include <stdio.h>

int main(){
    int example = 0;
    // example text
    return;
}

我将如何特别地使用sed来忽略所有以//#开头的行,同时也忽略/****/范围内的行? 我已经尝试过类似sed -E '/(^#|\/\*/,/\*\/|^\/\/)/!s/example/EXAMPLE/g'的方法,但是我感觉我没有正确使用|,因为它会弹出一个错误消息,提示“ unmatched(“

我想要的最终输出应该是

/**
example text
**/
#include <stdio.h>

int main(){
    int EXAMPLE = 0;
    // example text
    return;
}

从sed命令进行的更改会将程序中单词“ example”的实例更改为大写版本“ EXAMPLE”,而我想做的是确保注释行上的单词未更改。

1 个答案:

答案 0 :(得分:0)

在忽略sed不能成为这项工作的正确工具的可能性时,波纹管命令将在您的特定练习中发挥作用:

sed -E '/(#|\/\/)/b ; /\/\*\*/,/\*\*\//b; s/example/EXAMPLE/g' file
/**
example text
**/
#include <stdio.h> example

int main(){
    int EXAMPLE = 0;
    // example text
    return;
}

sed特殊词b使用标签:

  

'b LABEL'
       无条件分支到LABEL。标签可以省略,在        在哪种情况下,下一个周期开始。

换句话说,代替否定/pattern/!之类的模式,您可以使用不带标签的/pattern/b并在发现/pattern/时sed跳转(由于b)到下一个循环跳过替换s/example/EXAMPLE/g命令。

您的尝试无效,因为您尝试在|#之类的模式以及// /\/\*\*/,/\*\*\// >