用sed / awk注释掉N行

时间:2009-12-01 12:29:24

标签: sed awk

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

int var1;
int var2;
int var3;
int var4;
int var5;

我想评论3行,包括var2(而不是根据他们的内容!):

int var1;
// int var2;
// int var3;
// int var4;
int var5;

5 个答案:

答案 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