Shell 使用sed注释文件中的多行
我正在MAC OSX上工作。我正在编写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"); 但
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。感谢您的帮助。