关于sed多行替换的命令!
列如我有一个文件 test:该文件的内容为:
a
b
c
d
e
f
g
#########
我如何用sed命令将从c开始的这行到f这行都加上#.
只能用一次sed。 sed '3,6s/.*/#&/' test 如果我行号变了怎么办,我的想法是先找到c,然后在替换,这样替换的话如果c这行前面多了一行就不对了,有没有灵活点的方法啊,谢谢指点! sed '/^c$/,/^f$/s/^/#/' test
万一文件中有以下情况呢?
a
b
c
c
d
f
g
c
d
f
g sed '/c/,/f/s/.*/#&/g' file
有问题,不行的。 刚才多打了一个|,你看看现在可以不?我刚在我这里试了,可以的 我知道,但关键是如果文件中还有以下这种情况呢?
a
b
c
c
d
ze
f
g
#########
或者我前面说的那几种情况。 其实我要做的东西是这么一个功能:
我这个是一个配置文件,如果要用到这个功能(列如录音程序),那么我就将文件中录音这段程序注释去掉,如果想关闭这个功能的话,那么我就将文件中录音的程序注释加上去,下面是我这个文件中的一段代码:
if (!t_newtran()) {
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
break;
};
if(method=="INVITE"){
log("**************** vm start - begin ******************\n");
if(!vm("/tmp/am_fifo","voicemail")){
log("could not contact the answer machine\n");
t_reply("500","could not contact the answer machine");
};
log("**************** vm start - end ******************\n");
break;
} else if(method=="BYE"){
log("**************** vm end - begin ******************\n");
if(!vm("/tmp/am_fifo","bye")){
log("could not contact the answer machine\n");
t_reply("500","could not contact the answer machine");
};
log("**************** vm end - end ******************\n");
break;
};
按照前面斑竹的做发sed '/^c$/,/^f$/s/^/#/' test,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊? 其实我要做的东西是这么一个功能:
我这个是一个配置文件,如果要用到这个功能(列如录音程序),那么我就将文件中录音这段程序注释去掉,如果想关闭这个功能的话,那么我就将文件中录音的程序注释加上去,下面是我这个文件中的一段代码:
if (!t_newtran()) {
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
break;
};
if(method=="INVITE"){
log("**************** vm start - begin ******************\n");
if(!vm("/tmp/am_fifo","voicemail")){
log("could not contact the answer machine\n");
t_reply("500","could not contact the answer machine");
};
log("**************** vm start - end ******************\n");
break;
} else if(method=="BYE"){
log("**************** vm end - begin ******************\n");
if(!vm("/tmp/am_fifo","bye")){
log("could not contact the answer machine\n");
t_reply("500","could not contact the answer machine");
};
log("**************** vm end - end ******************\n");
break;
};
按照前面斑竹的做发sed '/^c$/,/^f$/s/^/#/' test,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊? 其实我要做的东西是这么一个功能:
我这个是一个配置文件,如果要用到这个功能(列如录音程序),那么我就将文件中录音这段程序注释去掉,如果想关闭这个功能的话,那么我就将文件中录音的程序注释加上去,下面是我这个文件中的一段代码:
if (!t_newtran()) {
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
break;
};
if(method=="INVITE"){
log("**************** vm start - begin ******************\n");
if(!vm("/tmp/am_fifo","voicemail")){
log("could not contact the answer machine\n");
t_reply("500","could not contact the answer machine");
};
log("**************** vm start - end ******************\n");
break;
} else if(method=="BYE"){
log("**************** vm end - begin ******************\n");
if(!vm("/tmp/am_fifo","bye")){
log("could not contact the answer machine\n");
t_reply("500","could not contact the answer machine");
};
log("**************** vm end - end ******************\n");
break;
};
按照前面斑竹的做发sed '/^c$/,/^f$/s/^/#/' test,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊? 不好意思,网业错误,我多发了几次 就这么说吧,就是在一个文件中能将指定的这个字符串开始,到下面15行将开头都加上注释,或都去掉注释,这个两条语句怎么写? sed '
/pattern1/{
N
P
D
/pattern2/!s/^/# /
}’
pattern1是你的这段代码的第一行的上面一行,pattern2是结束的行,要用正则表达市的语法书写。
试一下,如果不行,我们继续讨论。 这是加注释的情况,如果要去掉注释而又希望两者在一个sed中实现的话,可以在上面的sed脚本中间加一个测试,如果已经注释了,就去掉注释,如果未注释,就加注释。不过我觉得专业点的话,还是将sed防在bash脚本中,然后通过getopts分析命令行参数的方法来实现。 :lol:
页:
[1]
2