我正在研究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来做到这一点。如果是的话怎么样?
由于
答案 0 :(得分:2)
最简单的方法是使用地址范围
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;
答案 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所以我不会在这里做任何声明)。