jerry_cym 发表于 2005-7-20 10:41:32

关于sed多行替换的命令!

列如我有一个文件 test:
该文件的内容为:
a
b
c
d
e
f
g
#########
我如何用sed命令将从c开始的这行到f这行都加上#.
只能用一次sed。

fakeroot 发表于 2005-7-20 10:59:30

sed '3,6s/.*/#&/' test

jerry_cym 发表于 2005-7-20 11:08:10

如果我行号变了怎么办,我的想法是先找到c,然后在替换,这样替换的话如果c这行前面多了一行就不对了,有没有灵活点的方法啊,谢谢指点!

fakeroot 发表于 2005-7-20 12:06:08

sed '/^c$/,/^f$/s/^/#/' test

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

a
b
c
c
d
f
g

c
d
f
g

zhy2111314 发表于 2005-7-20 12:30:13

sed '/c/,/f/s/.*/#&/g' file

fakeroot 发表于 2005-7-20 12:31:58

有问题,不行的。

zhy2111314 发表于 2005-7-20 12:35:40

刚才多打了一个|,你看看现在可以不?我刚在我这里试了,可以的

fakeroot 发表于 2005-7-20 12:38:59

我知道,但关键是如果文件中还有以下这种情况呢?

a
b
c
c
d
ze
f
g
#########

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

jerry_cym 发表于 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,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊?

jerry_cym 发表于 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,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊?

jerry_cym 发表于 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,用三次就可以把这段通通注释掉,但如果我要打开这个功能,把这段的注释通通去掉的话,那我有应该怎么做啊?

jerry_cym 发表于 2005-7-20 13:58:56

不好意思,网业错误,我多发了几次

jerry_cym 发表于 2005-7-20 14:09:37

就这么说吧,就是在一个文件中能将指定的这个字符串开始,到下面15行将开头都加上注释,或都去掉注释,这个两条语句怎么写?

watch_1394 发表于 2005-7-25 16:40:40

sed '
/pattern1/{
N
P
D
/pattern2/!s/^/# /
}’

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

watch_1394 发表于 2005-7-25 16:56:10

这是加注释的情况,如果要去掉注释而又希望两者在一个sed中实现的话,可以在上面的sed脚本中间加一个测试,如果已经注释了,就去掉注释,如果未注释,就加注释。不过我觉得专业点的话,还是将sed防在bash脚本中,然后通过getopts分析命令行参数的方法来实现。 :lol:
页: [1] 2
查看完整版本: 关于sed多行替换的命令!