2009-12-01 5 views
4

Как я могу прокомментировать строки из определенного шаблона и N строк вперед?Комментарий из N строк с sed/awk

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

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

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

ответ

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}' 

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

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; 
+0

«от определенного рисунка» –

+0

ohh я пропустил это ... !! – sud03r

5

Это требует GNU sed

sed '/^int var2;$/,+2 s.^.//.' 
0
awk '/var2/{c=3}c-->0{ $0="//"$0}1' file 
+0

Также: 'awk '/ var2/{c = 3} c -> 0 {printf" // "} 1' file' –

3

GNU AWK (возможно, другие awks тоже) имеет рисунок диапазоны:

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

Также вы работаете с' --traditional' –

+0

+1 для удобства чтения – Idelic

 Смежные вопросы

  • Нет связанных вопросов^_^