如何从某个模式和N行开始注释掉行?
int var1;
int var2;
int var3;
int var4;
int var5;
我想评论3行,包括var2(而不是根据他们的内容!):
int var1;
// int var2;
// int var3;
// int var4;
int var5;
答案 0 :(得分:5)
这需要GNU sed
sed '/^int var2;$/,+2 s.^.//.'
答案 1 :(得分:3)
GNU awk(也许还有其他问题)有模式范围:
gawk '/var2/, c==2 {$0 = "//" $0; c++} { print }' file.c
或写得可读:
/var2/, c == 2 {
$0 = "//" $0
c++
}
{
print
}
编辑:
awk --posix '/var2/, c++ == 2 {$0 = "//" $0} { print }'
有效,所以我认为范围是AWK规范的一部分。您还可以将增量放在范围模式中以保存一些击键。
它将第一个动作应用于行,包括匹配var2的行,直到c == 2。 它将第二个模式应用于每一行。
答案 2 :(得分:0)
以下awk
脚本可以执行您的要求:
echo 'int var1;
int var2;
int var3;
int var4;
int var5;
' | awk '
/^int var2;$/ {
count = 3;
}
{
if (count > 0) {
$0 = "//"$0;
count = count - 1;
};
print;
}'
输出:
int var1;
//int var2;
//int var3;
//int var4;
int var5;
它的工作方式相对简单。计数器变量c
决定留下多少行进行评论。它从0开始,但是当您找到特定模式时,它将设置为3。
然后,它开始倒计时,影响那么多行(包括将它设置为3的行)。
如果您不担心可读性,可以使用较短的内容:
awk '/^int var2;$/{c=3}{if(c>0){$0="//"$0;c=c-1};print}'
请注意,只要找到模式,计数就会重置。这似乎是处理的合理方式:
int var1; ----> int var1;
int var2; //int var2;
int var3; //int var3;
int var2; //int var2;
int var3; //int var3;
int var4; //int var4;
int var5; int var5;
如果不您想要的内容,请将count = 3;
替换为if (count == 0) {count = 3;};
或使用:
awk '/^int var2;$/{if(c==0){c=3}}{if(c>0){$0="//"$0;c=c-1};print}'
用于紧凑版本。
答案 3 :(得分:0)
此剧本:
sed -i '2,4 s:^://:' test.txt
的test.txt:
int var1; int var2; int var3; int var4; int var5;
输出:
int var1; //int var2; //int var3; //int var4; int var5;
答案 4 :(得分:0)
awk '/var2/{c=3}c-->0{ $0="//"$0}1' file