使用sed在文件中注释多行

时间:2015-06-04 13:58:39

标签: shell sed

我正在研究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来做到这一点。如果是的话怎么样?

由于

3 个答案:

答案 0 :(得分:2)

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

sed "/^\s*log.*;$/ s|^|//|; /^\s*log/, /);$/ s|^|//|" input

它的作用是什么?

  • /^\s*log.*;$/ s|^|//|如果该行以log开头并以;结尾,则将^替换为//

    < / LI>
  • /\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;

答案 1 :(得分:1)

您可以使用sed

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

答案 2 :(得分:0)

当然不行。你在单词&#34; log&#34;上执行sed,这意味着如果在每行的开头没有这个单词,你就不会替换任何东西。

如果添加&#34; log&#34;是否可以确认它是否有效前三行开头的字?

如果是,解决方案是保持相同的命令,但删除单词&#34; log&#34;。也许像sed -i '' "s|"+*"|"//"|g" filename之类的东西(我不熟悉Mac OS X的sed所以我不会在这里做任何声明)。