Закомментируйте N строк с помощью sed / awk - PullRequest
4 голосов
/ 01 декабря 2009

Как закомментировать строки из определенного шаблона и N строк и далее?

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

Я хочу закомментировать 3 строки, включая var2 (а не в соответствии с их содержанием!):

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

Ответы [ 5 ]

5 голосов
/ 01 декабря 2009

Для этого требуется GNU sed

sed '/^int var2;$/,+2 s.^.//.'
3 голосов
/ 01 декабря 2009

GNU awk (возможно, и другие awk) имеет диапазоны шаблонов:

gawk '/var2/, c==2 {$0 = "//" $0; c++} { print }' file.c

Или написано читабельно:

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

{ 
    print
}

Edit:

awk --posix '/var2/, c++ == 2 {$0 = "//" $0} { print }'

работает, поэтому я думаю, что диапазоны являются частью спецификации AWK. Вы также можете поместить приращение в шаблон диапазона, чтобы сохранить некоторые нажатия клавиш.

Применяет первое действие к строкам, включая ту, которая соответствует var2, и после до c == 2 Применяет второй шаблон к каждой строке.

0 голосов
/ 01 декабря 2009
awk '/var2/{c=3}c-->0{ $0="//"$0}1' file
0 голосов
/ 01 декабря 2009

Также этот скрипт:
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;
0 голосов
/ 01 декабря 2009

Следующий скрипт 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}'

для компактной версии.

...