用sed/awk注释掉N行

用sed/awk注释掉N行,sed,awk,Sed,Awk,如何从某个模式和N行开始注释出行 int var1; int var2; int var3; int var4; int var5; 我想注释掉包括var2在内的3行(而不是根据它们的内容!): 以下awk脚本可以满足您的要求: echo 'int var1; int var2; int var3; int var4; int var5; ' | awk ' /^int var2;$/ { count = 3; } { if (count

如何从某个模式和N行开始注释出行

int var1;
int var2;
int var3;
int var4;
int var5;
我想注释掉包括var2在内的3行(而不是根据它们的内容!):


以下
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或使用:

awk '/^int var2;$/{if(c==0){c=3}}{if(c>0){$0="//"$0;c=c-1};print}'
对于精简版。

还有此脚本:
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; 输出:

int var1; //int var2; //int var3; //int var4; int var5; int-var1; //int-var2; //int-var3; //int-var4; int-var5;
这需要GNU
sed

sed '/^int var2;$/,+2 s.^.//.'
GNU awk(可能还有其他awk)具有模式范围:

gawk '/var2/, c==2 {$0 = "//" $0; c++} { print }' file.c
或写得通俗易懂:

/var2/, c == 2 {
    $0 = "//" $0
    c++
}

{ 
    print
}
编辑:

工作,所以我认为范围是AWK规范的一部分。你也可以把增量放在范围模式中以保存一些击键

它将第一个操作应用于包括与var2匹配的行在内的行,然后应用到c==2。
它将第二种模式应用于每一行。

另外:
awk'/var2/{c=3}c-->0{printf//“}1'文件
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 }'