Shell 使用sed注释文件中的多行

Shell 使用sed注释文件中的多行,shell,sed,Shell,Sed,我正在MAC OSX上工作。我正在编写shell脚本,以便向文件中的所有日志消息添加前缀“/”。我编写了以下sed脚本: sed -i '' "s|"log+*"|"//log"|g" filename 当日志消息只有一行时,脚本工作正常。但如果日志有多行,则会失败。例如: log("hi how are you"); 其输出结果为: //log("hi how are you"); 但

我正在MAC OSX上工作。我正在编写shell脚本,以便向文件中的所有日志消息添加前缀“/”。我编写了以下sed脚本:

    sed -i '' "s|"log+*"|"//log"|g" filename
当日志消息只有一行时,脚本工作正常。但如果日志有多行,则会失败。例如:

    log("hi
         how are
         you");
其输出结果为:

    //log("hi
           how are
           you");
但是,我希望输出为:

    //log("hi
    //     how are
    //     you");
因为我没怎么用sed,所以我不知道该怎么做。那么,是否可以使用sed来实现这一点呢。如果是,怎么做


谢谢,当然不行了。您正在对单词“log”执行sed,这意味着如果每行开头没有这个单词,您将无法替换任何内容

如果你在前三行的开头加上“log”这个词,你能确认它是否有效吗


如果是,解决方案是保留相同的命令,但删除单词“log”。可能类似于
sed-i''s |“+*”|“/”| g“filename
(我不熟悉Mac OS X的sed,所以我不会在这里作任何声明)。

您可以使用
sed

sed '/log/{:a;s/.*/\\\\\0/;/);[[:space:]]*$/!{n;ba}}' input.txt
  • /log(/
    搜索包含开头术语
    log(
    的行)
  • {
    打开一个代码块
  • :a
    定义了一个名为
    a
  • s/*/\0/
    在行前面添加
    \
  • /);[[:space:][]*$
    搜索结束符
    );
    后跟行末的可选空格
  • 如果找不到模式,
    !{n;ba}
    将执行。
    n
    将获取新行。
    ba
    分支回到
    a

    • 最简单的方法是使用地址范围

      sed "/^\s*log.*;$/ s|^|//|; /^\s*log/, /);$/ s|^|//|" input
      
      它的作用是什么?

      • /^\s*log.*;$/s^ ^ ^/^
        如果行以
        log
        开头,以
        结尾,则用
        /
        替换开头的
        ^

      • /\s*^log/,/);$/s^^ |/|“

        • /^log/,/);$/
          这是一个地址范围。对于此范围内的所有行,将执行替换。行的范围从第一个正则表达式匹配开始到结束匹配
      测试

      $ cat input
      log("hi
               how are
               you");
      
      this will also be not commented; 
      
      log ("test);
      
      this is not commented;
      
      $  sed "/^\s*log.*;$/ s|^|//|; /^\s*log/, /);$/ s|^|//|" input
      //log("hi
      //         how are
      //         you");
      
      this will also be not commented; 
      
      //log ("test);
      
      this is not commented;
      

      您在使用
      sed
      方面是否受到限制,或者是否有其他工具(如
      awk
      可用?@nu11p01n73R当前我正在使用sed,但如果可以使用任何其他工具来完成,我可以使用它。它会给出一个错误提示:sed:1:“/log/{:a;s/*/\0/…”:意外的EOF(待定)。请确保您正确复制粘贴了该命令。该命令正在工作。根据日志命令的缩进,每个模式匹配的
      /^\s*log…/
      可能是一个有用的调整。@cmbuckley使其更加完善。感谢您提供的提示。更新后的回答:)@nu11p01n73R谢谢:)@nu11p01n73R我尝试了您的建议,但没有成功如果该行前面有一些空格,till似乎不起作用。它在您这边起作用吗?对于MAC OS,我们需要使用[[sapce]]来匹配空格。sed/^[:space:]*log.*;$/s | ^ ^ |/|/^[:space:]*log/,/)$/s | ^ ^ |/|适用于MAC OS。感谢您的帮助。