Вставлять текст в начале каждой строки между двумя узорами, включительно - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь закомментировать все часы _asm (и иногда __asm) в некоторых C-файлах.Так, например,

_asm {
bla
bla
}

становится

//## _asm {
//## bla
//## bla
//## }

и

__asm { bla bla }

становится

//## __asm { bla bla }

Кроме того, иногда встречаются строки _asm безфигурные скобки

_asm bla bla

И это должно стать

//## _asm bla bla

Я сомневаюсь, что это можно сделать с помощью одного выражения sed или awk, и это нормально.Мне просто нужно иметь возможность закомментировать эти блоки точно таким же образом, чтобы я мог отменить все, просто удалив все шаблоны "###" из файла.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Это может сработать для вас (GNU sed):

sed '/^_\+asm/!b;s@^@//## @;/{/!b;/{.*}/b;:a;n;s@^@//## @;/}/!ba' file

Сосредоточиться на начинающихся строках _asm.Вставьте символы комментария, и если в строке нет скобок или открывающих и закрывающих скобок, то все готово.В противном случае выведите текущую строку и прочитайте следующую.Прокомментируйте эту строку и повторяйте до тех пор, пока не будет найдена закрывающая скобка.

0 голосов
/ 18 октября 2018

Используя это как тестовый файл:

It works
elanblkaneglka
_asm {
bla
bla
}
bjkzrbgjkzbjkerzeg
zjegbzkjebzkjg{
   blabla
}
__asm { bla bla }
_asm bla bla
bajekbajkegbakeg
Next lines should not work
_asm
{blabla}
_asm {
bla{
  bla
}
bla
}

Я пробовал это:

awk '/_+asm *\{/{bracket=1}/_+asm/{comment=1}comment{print "//##", $0}!comment;!bracket||/\}/{comment=0;bracket=0}' test.txt

Конечно, это уродливо, но регулярные выражения не подходят для такого рода проблемы.

  • Не работает, если в блоке __asm ​​{} есть другие скобки.

  • Не работает, если {и __asmне находятся на одной линии.

Результат:

It works
elanblkaneglka
//## _asm {
//## bla
//## bla
//## }
bjkzrbgjkzbjkerzeg
zjegbzkjebzkjg{
   blabla
}
//## __asm { bla bla }
//## _asm bla bla
bajekbajkegbakeg
Next lines should not work
//## _asm
{blabla}
//## _asm {
//## bla{
//##   bla
//## }
bla
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...