所以我有一些示例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”,而我想做的是确保注释行上的单词未更改。
答案 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
命令。
您的尝试无效,因为您尝试在|
或#
之类的模式以及//