【问题标题】:Comment first instance of string after specifc string在特定字符串之后注释字符串的第一个实例
【发布时间】:2020-05-04 03:06:37
【问题描述】:

我希望能够仅评论cin >> n;int main 之后的第一次出现。

通过 bash 执行此操作,我尝试过使用 grep 和 sed 的组合,但我是 bash 新手,不知道如何完成此操作。

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;
} 

【问题讨论】:

    标签: bash sed grep


    【解决方案1】:

    您可以使用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 &gt;&gt; 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
    

    【讨论】:

    • 我认为应该是/int main/而不是0(“在int main之后第一次出现,而不是整体上第一次出现),并且评论指示器可能是//而不是# .
    • 这是个好主意。让我玩弄它。使用0 本身具有将sed 置于其范围末尾的效果,我将检查int main 是否也能正常工作并更新。
    • 两个正则表达式之间的范围的唯一问题是:假设由于某种原因文本cin &gt;&gt; nmain 出现在同一行。在这种情况下,范围将扩展到cin &gt;&gt; n第二 次出现。 (这就是 0 的好处 - 它完全避免了这个问题。)在这种情况下,假设这不会发生可能是安全的,但对于更一般的情况,请记住这一点。
    • 您可以使用s|cin &gt;&gt; n|// &amp;|cin &gt;&gt; n 的重复出现次数从3 减少到2。 2 个重复仍然不是很好,但它是使用范围表达式的常见副作用(这就是为什么我提倡不要使用它们并使用标志来代替)并且它比 3 更好:-)。
    • 哦。 mathguy 和 Ed 的想法都很好。这是sed 提供解决方案但似乎没有提供“完美”解决方案的地方。在一个简短的解决方案中有很多需要隐藏的警告。
    【解决方案2】:
    $ 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;
    }
    

    【讨论】:

    • awk 解决方案在处理 main() 的同一行上似乎更灵活,这会导致 sed 问题。
    • 它也不需要任何重复的条件,这就是我喜欢它的原因。
    猜你喜欢
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2020-03-04
    • 2020-05-16
    • 2021-09-22
    • 1970-01-01
    • 2011-06-04
    • 2022-11-16
    相关资源
    最近更新 更多