Как вставить строку после шаблона и вставить еще одну строку до первого вхождения слова из pattern1 с помощью sed? - PullRequest
0 голосов
/ 18 ноября 2018
sub tc1 {
a
b
c
d
endcase
}
sub tc2
{
a
b
c
endcase
}

Я хочу вызвать подпрограмму, скажем start () после sub tc1 и вызвать stop () перед этим конечным регистром sub tc1

Я использовал эту команду

perl -i.bak -pe 'BEGIN{undef $/;} s/(sub\s+TC1[\s\n]+\{)(.*)endcase/$1\n&start();$2&stop();\nendcase/smg' file.txt

выход

sub tc1 {
&start();
a
b
c
d
endcase
}
sub tc2
{
a
b
c
stop();
endcase
}

но он изменяет последний сопоставленный шаблон конца регистра

Ожидаемый результат

sub tc1 {
&start();
a
b
c
d
&stop();
endcase
}

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

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

sed -e '/sub tc1/,/endcase/!b;/sub tc1/a\&start();' -e '/endcase/i\&stop();' file

Используйте диапазон для фокусировки на начальный / конечный разделители в этом случае sub tc1 / endcase. Затем добавьте строку &start(); после начального разделителя и вставьте строку &stop(); перед конечным разделителем.

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

Это должно быть легкой задачей awk. Пожалуйста, попробуйте выполнить следующие действия, если вы в порядке с awk.

awk '
/sub tc1/{
  sub_tcl_val=$0 ORS "&start();"
  flag=val=""
  next
}
/endcase/ && ++count==1{
  flag=1
  print sub_tcl_val ORS val ORS "&stop()" ORS $0 ORS "}"
  val=sub_tcl_val=""
  next
}
!flag{
  val=val?val ORS $0:$0
}'  Input_file

Вывод будет следующим.

sub tc1 {
&start();
a
b
c
d
&stop()
endcase
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...