TCL скрипт для поиска скрипта и добавления нового текста перед искомой строкой с номером - PullRequest
0 голосов
/ 26 марта 2020

Ниже приведено частичное содержимое моего входного файла:

   xyz 
   abc
   MainContent(abc_dt) {
      sc: it;
    }
    MainContent(xyz_cnt) {
      sc : it;
    }
    MainContent(asd_zxc) {
      sc : it;
    }

Здесь я хочу найти строку "MainContent" и добавить новую строку перед ней ... эта новая строка должна иметь "Sb (текст, который находится внутри скобки в MainContent_1) "... это также должно добавить открывающую и закрывающую скобки перед следующим появлением Sb:

Ожидаемый вывод из сценария:

   xyz 
   abc
   Sb(abc_dt_sb1) {
   MainContent(abc_dt) {
      sc: it;
    }
   }
   Sb(xyz_cnt_sb2) {
    MainContent(xyz_cnt) {
      sc : it;
    }
   } 
   Sb(asd_zxc_sb3) {
      MainContent(asd_zxc) {
      sc : it;
    }
   }

Может кто-то Пожалуйста, помогите мне создать сценарий TCL для этого?

1 Ответ

0 голосов
/ 26 марта 2020

Этот код будет обрабатывать ваш текст при стандартном вводе и выводить результаты при стандартном выводе. Перенаправьте его по мере необходимости.

set counter 0
set expectBrace false
while {[gets stdin line] >= 0} {
    if {!$expectBrace && [regexp {^\s*MainContent\s*\((\w+)\)} $line -> bits]} {
        puts [format "Sb(%s_sb%d) \{" $bits [incr counter]]
        set expectBrace true
    }
    puts $line
    if {$expectBrace && [regexp {^\s*\}\s*$} $line]} {
        puts "\}"
        set expectBrace false
    }
}

Использование регулярных выражений для сопоставления триггеров для изменений состояния в небольшом автомате состояний (два состояния, управляемые expectBrace) - довольно обычный анализ. Я использовал format для подстановок в строку Sb(…); они достаточно просты, чтобы вместо них можно было использовать прямые замены.

Я ничего не сделал для добавления отступов.

...