Re: 问一个sed的问题
On 2006年11月30日 22:24, amateur write: On Thu, Nov 30, 2006 at 11:05:47AM +0800, Xie Yanbo wrote: On 2006年11月30日 10:14, amateur write: 那是我没有表达清楚了,我的主要目的是去掉源代码中的注释,这个需要在多行 中进行搜索匹配,应该不是多行替换,因为 sed 的替换操作好似只能在一行内 使用,而 sed 的行操作 (d/p) 都是针对整行进行的,比如我用匹配 main 函数 的方法匹配注释的话,就会是的包含有 /* */ 注释的所有行都会被删除。象下 面的例子就不能用这种方法: int main() { do_something; /* this block is commented do_other_thing; ... do_third_thing; */ } 请看一下 remove_c_comment.sed 是否就是你要的脚本。 正是我要的功能,谢谢! 不过你发到我的个人邮箱里了,能否解释一下 /\*\//!{ $!{ N; bt } } 的意思,看不懂其中 !{ $!{ N; bt } } 这个操作的意义 这行是查找C注释块的结束标识“*/”,如果没有找到它,并且也不是文件的最后一 行,那么就追加读入下一行,并回到这个循环的最开始位置,继续处理。 0$ cat remove_c_comment.sed :t /\/\*/,/\*\// { /\*\//!{ $!{ N; bt } } s/\/\*.*\*\///; } 0$ cat test.c int main() { do_something; /* this block is commented do_other_thing; ... do_third_thing; */ return 0; } 0$ cat test.c | sed -f remove_c_comment.sed int main() { do_something; return 0; } 0$ - -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: 问一个sed的问题
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 amateur 写道: On Wed, Nov 29, 2006 at 09:19:54PM +0800, shell wrote: -BEGIN PGP SIGNED MESSAGE- Hash: SHA1 amateur 写道: On Wed, Nov 29, 2006 at 07:29:53PM +0800, jun yu wrote: 可以的 http://www-128.ibm.com/developerworks/cn/linux/shell/sed/sed-1/index.html 具体你可以看上面链接的介绍. 上面好象没有提到任何与多行模式相关的内容,不知道你是怎么做的,能提示一 下吗?比如下例: 虽然不知道怎么做,不过main函数的匹配就是典型的多行匹配。 那是我没有表达清楚了,我的主要目的是去掉源代码中的注释,这个需要在多行 中进行搜索匹配,应该不是多行替换,因为 sed 的替换操作好似只能在一行内 使用,而 sed 的行操作 (d/p) 都是针对整行进行的,比如我用匹配 main 函数 的方法匹配注释的话,就会是的包含有 /* */ 注释的所有行都会被删除。象下 面的例子就不能用这种方法: int main() { do_something; /* this block is commented do_other_thing; ... do_third_thing; */ } 有没有办法使得可以替换多行内容,比如将一个 C++ 语言源文件中的所有注释 全部去掉,对于 // 开始的注释比较好处理,但对于 /* xxx */ 这种注释就比 较麻烦了。 要我碰这种情况就写C代码了——不过考虑情况蛮多的,应该有50多行吧—— 或者要么你三次匹配,头两次是完全的替换/*或者*/为\n/*或者*/\n。然后再匹 配——就是比较蠢了—— - -- 与其相濡以沫,不如相忘于江湖 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFFbu9SOhzb4WnHl2oRAt1bAKCrffeDfo/Mn7T2JZT29kwIwUBpZACfWpCJ mOOAR8snD1x6/0+o4CGXSPM= =A2Rv -END PGP SIGNATURE-
Re: 问一个sed的问题
On Wed, Nov 29, 2006 at 10:53:43AM +0800, Quinn Li wrote: sed会不会有这样的参数? 我一般是用 vim 做这个工作 vim *.html 然后在命令模式输入冒号,后面跟上这个命令 : argdo % s/x/s/ge | update (指的是对于所有*.html,执行替换,并且存盘) 然后退出vim 有没有办法使得可以替换多行内容,比如将一个 C++ 语言源文件中的所有注释 全部去掉,对于 // 开始的注释比较好处理,但对于 /* xxx */ 这种注释就比 较麻烦了。 -- When I was younger, I could remember anything, whether it had happened or not; but my faculties are decaying now and soon I shall be so I cannot remember any but the things that never happened. It is sad to go to pieces like this but we all have to do it. -- Mark Twain
Re: 问一个sed的问题
可以的 http://www-128.ibm.com/developerworks/cn/linux/shell/sed/sed-1/index.html 具体你可以看上面链接的介绍. 2006/11/29, amateur [EMAIL PROTECTED]: On Wed, Nov 29, 2006 at 10:53:43AM +0800, Quinn Li wrote: sed会不会有这样的参数? 我一般是用 vim 做这个工作 vim *.html 然后在命令模式输入冒号,后面跟上这个命令 : argdo % s/x/s/ge | update (指的是对于所有*.html,执行替换,并且存盘) 然后退出vim 有没有办法使得可以替换多行内容,比如将一个 C++ 语言源文件中的所有注释 全部去掉,对于 // 开始的注释比较好处理,但对于 /* xxx */ 这种注释就比 较麻烦了。 -- When I was younger, I could remember anything, whether it had happened or not; but my faculties are decaying now and soon I shall be so I cannot remember any but the things that never happened. It is sad to go to pieces like this but we all have to do it. -- Mark Twain
Re: 问一个sed的问题
On Wed, Nov 29, 2006 at 07:29:53PM +0800, jun yu wrote: 可以的 http://www-128.ibm.com/developerworks/cn/linux/shell/sed/sed-1/index.html 具体你可以看上面链接的介绍. 上面好象没有提到任何与多行模式相关的内容,不知道你是怎么做的,能提示一 下吗?比如下例: int main() { do_something; /* this block is commented do_other_thing; ... do_third_thing; */ } 有没有办法使得可以替换多行内容,比如将一个 C++ 语言源文件中的所有注释 全部去掉,对于 // 开始的注释比较好处理,但对于 /* xxx */ 这种注释就比 较麻烦了。 -- Steady movement is more important than speed, much of the time. So long as there is a regular progression of stimuli to get your mental hooks into, there is room for lateral movement. Once this begins, its rate is a matter of discretion. -- Corwin, Prince of Amber
Re: 问一个sed的问题
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 amateur 写道: On Wed, Nov 29, 2006 at 07:29:53PM +0800, jun yu wrote: 可以的 http://www-128.ibm.com/developerworks/cn/linux/shell/sed/sed-1/index.html 具体你可以看上面链接的介绍. 上面好象没有提到任何与多行模式相关的内容,不知道你是怎么做的,能提示一 下吗?比如下例: int main() { do_something; /* this block is commented do_other_thing; ... do_third_thing; */ } 虽然不知道怎么做,不过main函数的匹配就是典型的多行匹配。 有没有办法使得可以替换多行内容,比如将一个 C++ 语言源文件中的所有注释 全部去掉,对于 // 开始的注释比较好处理,但对于 /* xxx */ 这种注释就比 较麻烦了。 - -- 与其相濡以沫,不如相忘于江湖 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFFbYHeOhzb4WnHl2oRAmEvAJ9yqrhpWVKTNWPrFG8wbcxagaY03gCgoxnA 9tZjVVCigXUQj9vVNxLiLeI= =Cx3V -END PGP SIGNATURE-
Re: 问一个sed的问题
如果你的sed有-i选项 sed -i -e 's/x/s/' *.html 如果没有可以用一个简单的脚本 - #!/bin/sh for file in `ls *.cpp`;do sed -e 's/x//' $file tmpfile cp tmpfile $file done rm -f tmpfile - 去掉/*x*/样式的注释 sed -r -e 's/\/\*.*\*\///g' test.cpp jun yu 写道: sed默认是输出到stdout里,但是当我需要对多个文件进行替换操作时,就有问 题了,比如: sed -e 's/x/s/' *.html html文件有很多个,不知道怎么样才能替换多个文件。 感觉应该是通过多个命令行工具组合来进行,但是就是一下子想不明白。 谁有这方面的经验吗? -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: 问一个sed的问题
sed -i[.backup-postfix] -e '...' files 这个-i选项是在sed版本4以后加入的,所以如果你用的是之前的版本话,就无法用到这个功能了,此时可以用perl完成相同的功能, perl -pi[.backup-postfix] -e '...' files On 11/30/06, lnxpgn [EMAIL PROTECTED] wrote: 如果你的sed有-i选项 sed -i -e 's/x/s/' *.html 如果没有可以用一个简单的脚本 - #!/bin/sh for file in `ls *.cpp`;do sed -e 's/x//' $file tmpfile cp tmpfile $file done rm -f tmpfile - 去掉/*x*/样式的注释 sed -r -e 's/\/\*.*\*\///g' test.cpp jun yu 写道: sed默认是输出到stdout里,但是当我需要对多个文件进行替换操作时,就有问 题了,比如: sed -e 's/x/s/' *.html html文件有很多个,不知道怎么样才能替换多个文件。 感觉应该是通过多个命令行工具组合来进行,但是就是一下子想不明白。 谁有这方面的经验吗? -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: 问一个sed的问题
On Wed, Nov 29, 2006 at 09:19:54PM +0800, shell wrote: -BEGIN PGP SIGNED MESSAGE- Hash: SHA1 amateur 写道: On Wed, Nov 29, 2006 at 07:29:53PM +0800, jun yu wrote: 可以的 http://www-128.ibm.com/developerworks/cn/linux/shell/sed/sed-1/index.html 具体你可以看上面链接的介绍. 上面好象没有提到任何与多行模式相关的内容,不知道你是怎么做的,能提示一 下吗?比如下例: 虽然不知道怎么做,不过main函数的匹配就是典型的多行匹配。 那是我没有表达清楚了,我的主要目的是去掉源代码中的注释,这个需要在多行 中进行搜索匹配,应该不是多行替换,因为 sed 的替换操作好似只能在一行内 使用,而 sed 的行操作 (d/p) 都是针对整行进行的,比如我用匹配 main 函数 的方法匹配注释的话,就会是的包含有 /* */ 注释的所有行都会被删除。象下 面的例子就不能用这种方法: int main() { do_something; /* this block is commented do_other_thing; ... do_third_thing; */ } 有没有办法使得可以替换多行内容,比如将一个 C++ 语言源文件中的所有注释 全部去掉,对于 // 开始的注释比较好处理,但对于 /* xxx */ 这种注释就比 较麻烦了。 -- Be careful of reading health books, you might die of a misprint. -- Mark Twain
Re: 问一个sed的问题
On Wed, Nov 29, 2006 at 10:41:52AM +0800, jun yu wrote: sed默认是输出到stdout里,但是当我需要对多个文件进行替换操作时,就有问 题了,比如: sed -e 's/x/s/' *.html html文件有很多个,不知道怎么样才能替换多个文件。 摘自 sed(1) 手册页: -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) Ming 2006.11.28 -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: 问一个sed的问题
我都用perl perl -pi -e 's/xxx/yy/g' *.html Ming Hua 写道: On Wed, Nov 29, 2006 at 10:41:52AM +0800, jun yu wrote: sed默认是输出到stdout里,但是当我需要对多个文件进行替换操作时,就有问 题了,比如: sed -e 's/x/s/' *.html html文件有很多个,不知道怎么样才能替换多个文件。 摘自 sed(1) 手册页: -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) Ming 2006.11.28 begin:vcard fn:Wing Sun n:Sun;Wing email;internet:[EMAIL PROTECTED] tel;work:(8625)83191923-188 tel;fax:(8625)83190921 version:2.1 end:vcard
Re: 问一个sed的问题
yes, me too. Wing sun 写道: 我都用perl perl -pi -e 's/xxx/yy/g' *.html Ming Hua 写道: On Wed, Nov 29, 2006 at 10:41:52AM +0800, jun yu wrote: sed默认是输出到stdout里,但是当我需要对多个文件进行替换操作时,就有问 题了,比如: sed -e 's/x/s/' *.html html文件有很多个,不知道怎么样才能替换多个文件。 摘自 sed(1) 手册页: -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) Ming 2006.11.28 -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: 问一个sed的问题
vim 那个我也用,但是匹配路径的时候要打很多的\/\/,比较麻烦,用sed不用,所以想研究一下这个试试。 在06-11-29,jun yu [EMAIL PROTECTED] 写道: sed默认是输出到stdout里,但是当我需要对多个文件进行替换操作时,就有问题了,比如: sed -e 's/x/s/' *.html html文件有很多个,不知道怎么样才能替换多个文件。 感觉应该是通过多个命令行工具组合来进行,但是就是一下子想不明白。 谁有这方面的经验吗?
Re: 问一个sed的问题
对了就是这个,非常感谢! 2006/11/29, Ming Hua [EMAIL PROTECTED]: On Wed, Nov 29, 2006 at 10:41:52AM +0800, jun yu wrote: sed默认是输出到stdout里,但是当我需要对多个文件进行替换操作时,就有问 题了,比如: sed -e 's/x/s/' *.html html文件有很多个,不知道怎么样才能替换多个文件。 摘自 sed(1) 手册页: -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) Ming 2006.11.28 -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]