Re: 问一个sed的问题

2006-12-01 文章 Xie Yanbo

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的问题

2006-11-30 文章 shell
-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的问题

2006-11-29 文章 amateur
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的问题

2006-11-29 文章 jun yu

可以的

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的问题

2006-11-29 文章 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; */

}



 
 有没有办法使得可以替换多行内容,比如将一个 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的问题

2006-11-29 文章 shell
-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的问题

2006-11-29 文章 lnxpgn
如果你的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的问题

2006-11-29 文章 Li Guo

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的问题

2006-11-29 文章 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
  */ 这种注释就比
  较麻烦了。

-- 
Be careful of reading health books, you might die of a misprint.
-- Mark Twain



Re: 问一个sed的问题

2006-11-28 文章 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的问题

2006-11-28 文章 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


 



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的问题

2006-11-28 文章 Stanley Peng

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的问题

2006-11-28 文章 jun yu

vim 那个我也用,但是匹配路径的时候要打很多的\/\/,比较麻烦,用sed不用,所以想研究一下这个试试。

在06-11-29,jun yu [EMAIL PROTECTED] 写道:


sed默认是输出到stdout里,但是当我需要对多个文件进行替换操作时,就有问题了,比如:

sed -e 's/x/s/' *.html

html文件有很多个,不知道怎么样才能替换多个文件。

感觉应该是通过多个命令行工具组合来进行,但是就是一下子想不明白。

谁有这方面的经验吗?



Re: 问一个sed的问题

2006-11-28 文章 jun yu

对了就是这个,非常感谢!



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]