QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4198|回复: 15

关于sed多行替换的命令!

[复制链接]
发表于 2005-7-20 10:41:32 | 显示全部楼层 |阅读模式
列如我有一个文件 test:
该文件的内容为:
a
b
c
d
e
f
g
#########
我如何用sed命令将从c开始的这行到f这行都加上#.
只能用一次sed。
发表于 2005-7-20 10:59:30 | 显示全部楼层
sed '3,6s/.*/#&/' test
回复

使用道具 举报

 楼主| 发表于 2005-7-20 11:08:10 | 显示全部楼层
如果我行号变了怎么办,我的想法是先找到c,然后在替换,这样替换的话如果c这行前面多了一行就不对了,有没有灵活点的方法啊,谢谢指点!
回复

使用道具 举报

发表于 2005-7-20 12:06:08 | 显示全部楼层
sed '/^c$/,/^f$/s/^/#/' test

万一文件中有以下情况呢?

[code:1]a
b
c
c
d
f
g[/code:1]

[code:1]c
d
f
g[/code:1]
回复

使用道具 举报

发表于 2005-7-20 12:30:13 | 显示全部楼层
[code:1]sed '/c/,/f/s/.*/#&/g' file
[/code:1]
回复

使用道具 举报

发表于 2005-7-20 12:31:58 | 显示全部楼层
有问题,不行的。
回复

使用道具 举报

发表于 2005-7-20 12:35:40 | 显示全部楼层
刚才多打了一个|,你看看现在可以不?我刚在我这里试了,可以的
回复

使用道具 举报

发表于 2005-7-20 12:38:59 | 显示全部楼层
我知道,但关键是如果文件中还有以下这种情况呢?

[code:1]a
b
c
c
d
ze
f
g
#########[/code:1]

或者我前面说的那几种情况。
回复

使用道具 举报

 楼主| 发表于 2005-7-20 13:56:26 | 显示全部楼层
其实我要做的东西是这么一个功能:
我这个是一个配置文件,如果要用到这个功能(列如录音程序),那么我就将文件中录音这段程序注释去掉,如果想关闭这个功能的话,那么我就将文件中录音的程序注释加上去,下面是我这个文件中的一段代码:
        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,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊?
回复

使用道具 举报

 楼主| 发表于 2005-7-20 13:56:57 | 显示全部楼层
其实我要做的东西是这么一个功能:
我这个是一个配置文件,如果要用到这个功能(列如录音程序),那么我就将文件中录音这段程序注释去掉,如果想关闭这个功能的话,那么我就将文件中录音的程序注释加上去,下面是我这个文件中的一段代码:
        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,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊?
回复

使用道具 举报

 楼主| 发表于 2005-7-20 13:57:36 | 显示全部楼层
其实我要做的东西是这么一个功能:
我这个是一个配置文件,如果要用到这个功能(列如录音程序),那么我就将文件中录音这段程序注释去掉,如果想关闭这个功能的话,那么我就将文件中录音的程序注释加上去,下面是我这个文件中的一段代码:
        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,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊?
回复

使用道具 举报

 楼主| 发表于 2005-7-20 13:58:56 | 显示全部楼层
不好意思,网业错误,我多发了几次
回复

使用道具 举报

 楼主| 发表于 2005-7-20 14:09:37 | 显示全部楼层
就这么说吧,就是在一个文件中能将指定的这个字符串开始,到下面15行将开头都加上注释,或都去掉注释,这个两条语句怎么写?
回复

使用道具 举报

发表于 2005-7-25 16:40:40 | 显示全部楼层
[code:1]sed '
/pattern1/{
N
P
D
/pattern2/!s/^/# /
}’[/code:1]

pattern1是你的这段代码的第一行的上面一行,pattern2是结束的行,要用正则表达市的语法书写。
试一下,如果不行,我们继续讨论。
回复

使用道具 举报

发表于 2005-7-25 16:56:10 | 显示全部楼层
这是加注释的情况,如果要去掉注释而又希望两者在一个sed中实现的话,可以在上面的sed脚本中间加一个测试,如果已经注释了,就去掉注释,如果未注释,就加注释。不过我觉得专业点的话,还是将sed防在bash脚本中,然后通过getopts分析命令行参数的方法来实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 20:21 , Processed in 0.065015 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表