Как закомментировать первое вхождение строки после исходной совпадающей строки bash - PullRequest
0 голосов
/ 06 мая 2020

Я пишу сценарий bash для домашнего задания, который находит первое вхождение этой строки: "cin >> n;" после int main () в файле c ++ и закомментировал его.

Проблема в том, что "cin >> n" может существовать или не существовать внутри main, а main может иметь любой размер строк, поэтому у меня для поиска main () и затем снова поиск в main для "cin >> n;" после нахождения main. Я предполагаю, что для этого можно использовать sed, но я знаю только, как искать по одному.

Вот и пример входного файла:

#include <studio.h>
void hi()
{
  int n;
  cin >> n; //I dont want to be commented out
  prinf("hi");
}

int main()
{
  int n;
  bool foo = false;
  cin >> n; //I want to be commented out
  if(!foo){
    cin >> n; //I dont want to be commented out
  }  
}

void supp(){
  cin >> n; //I dont want to be commented out
}

1 Ответ

1 голос
/ 06 мая 2020

Предполагая, что ваш файл имеет правильный отступ, как показано выше, и называется prog.c, вы можете ввести:

sed '/^int main/,$s|^  \( *cin >>.*\)|//&\n§§|' prog.c |
sed '/^§§/,$s|//\( *cin >> n\)|  \1|' |
sed '/^§§/d'

Идея состоит в том, чтобы закомментировать все строки между int main() и концом файл, содержащий cin >> n и добавляющий строку, содержащую §§ (может быть что-то еще), сразу после каждой совпадающей строки.

Второй шаг - удалить из комментариев все строки, содержащие cin >> n после первого появления §§, до конца функции main().

Как только это будет сделано, все строки, содержащие §§, должны быть удалены.

Изменить:

Я нашел гораздо более простое решение после много думает:

sed '/^int main/,/^ *cin >> n/s|^  \( *cin >>.*\)|//\1|' prog.c

Идея этого второго решения состоит в том, чтобы закомментировать все строки с cin >> n от строки, где остается int main(), до строки с первым появлением cin >> n. Так просто, как, что. Извините, что я не видел этого раньше.

Демо

Это результат обоих решений выше:

#include <studio.h>
void hi()
{
  int n;
  cin >> n; //I dont want to be commented out
  prinf("hi");
}

int main()
{
  int n;
  bool foo = false;
//  cin >> n; //I want to be commented out
  if(!foo){
      cin >> n; //I dont want to be commented out
  }  
}

void supp(){
  cin >> n; //I dont want to be commented out
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...