Предполагая, что ваш файл имеет правильный отступ, как показано выше, и называется 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
}