Комментируйте первый экземпляр строки после указанной c строки - PullRequest
0 голосов
/ 04 мая 2020

Я хочу иметь возможность комментировать только первое вхождение cin >> n; после int main.

Делая это через bash, я попробовал комбинацию с использованием grep и sed, но я новичок в bash и я не уверен, как это сделать sh.

int main(int argc, char** argv)
{
  int n;
  cin >> n;

  cout << factorial(n) << endl;
  if (n > 10)
  {
    cin >> n;  // don't want it to change this one!
    double d = log(n);
    cout << d;
  }
  return 0;
} 

Ответы [ 2 ]

1 голос
/ 04 мая 2020
$ awk '/int main/{f=1} f && sub(/cin >> n/,"// &"){f=0} 1' file
int main(int argc, char** argv)
{
  int n;
  // cin >> n;

  cout << factorial(n) << endl;
  if (n > 10)
  {
    cin >> n;  // don't want it to change this one!
    double d = log(n);
    cout << d;
  }
  return 0;
}
1 голос
/ 04 мая 2020

Это можно сделать с помощью sed и выражения диапазона 0,/regex/s/regex/replacement/, которое приводит к установке sed в конце этого диапазона, когда выполняется замена, ограничивая замену первым случаем, например

sed '0,/cin >> n/s/cin >> n/\/\/ cin >> n/' file

Результат:

int main(int argc, char** argv)
{
  int n;
  // cin >> n;

  cout << factorial(n) << endl;
  if (n > 10)
  {
    cin >> n;  // don't want it to change this one!
    double d = log(n);
    cout << d;
  }
  return 0;
}

Если у вас есть код до main, который может включать cin >> n, тогда вы можете использовать int main в качестве начала диапазона, например

sed '/int main/,/cin >> n/s/cin >> n/\/\/ cin >> n/' file

Благодаря @ BenjaminW

Если вам не нравится внешний вид \/\/, вы можете выбрать альтернативный разделитель, который будет сокращать забор. смотри, например

sed '/int main/,/cin >> n/s|cin >> n|// cin >> n|' file
...