免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10124 | 回复: 5
打印 上一主题 下一主题

sed能不能实现多行匹配? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-16 11:30 |只看该作者 |倒序浏览
大家好!sed中的正则表达式能实现多行匹配吗?
我想匹配/*...*/这种形式的注释,然后删掉它,但下面这个命令不行哦

sed 's,/\*[^/]\*/,,g'

它能删掉单行注释,对于多行不起作用的。大家有什么办法吗?

论坛徽章:
0
2 [报告]
发表于 2007-01-16 14:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
aickgaven 该用户已被删除
3 [报告]
发表于 2007-01-16 14:48 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2007-01-16 14:51 |只看该作者
sed -i "/\/\*/,/\*\//d" youfile

论坛徽章:
0
5 [报告]
发表于 2007-01-16 15:11 |只看该作者
  1. #去掉c代码中的注释

  2. #我的思路基本是:
  3. #1、除出 // comment
  4. #2、对于 /* comment */,由于可能跨行,sed不大好处理。
  5. #    a. 将 /* 替换成 \n^/*,*/ 替换成 */\n,然后把 /* 和 */ 中间的行删除
  6. #    b. 在 /* 开始,到 */ 之前那些行通过 N读入,然后一次过删除。
  7. #    c. /* 行从 /*删除,在遇到 */之前的行删除,*/行 删除 */之前内容。


  8. #    a. 将 /* 替换成 \n^/*,*/ 替换成 */\n,然后把 /* 和 */ 中间的行删除
  9. sed '
  10.         /\/\*/{
  11.                 h
  12.                 G
  13.                 s-/\*.*\(\n\)-\1-
  14.         }
  15. ' a |sed '
  16.         /\*\//{
  17.                 h
  18.                 G
  19.                 s-\(\n\).*\*/-\1-
  20.         }
  21. ' |sed '/\/\*/,/\*\//d;s-//.*--; '


  22. #    b. 在 /* 开始,到 */ 之前那些行通过 N读入,然后一次过删除。
  23. sed '
  24.         s%//.*%%

  25.         /\/\*/{
  26.         :next
  27.                 N
  28.                 /\*\//!b next
  29.                 s%/\*.*\*/%%
  30.         }
  31.         /\/\*/b next
  32. ' a


  33. #    c. /* 行从 /*删除,在遇到 */之前的行删除,*/行 删除 */之前内容。
  34. sed '
  35.         s-/\*.*\*/--

  36.         /\/\*/{
  37.         :comment
  38.                 s-/\*.*--
  39.         :next
  40.                 n
  41.                 # d dosent work, so s-^.-//&-
  42.                 s-^.-//&-
  43.                 /\*\//!b next
  44.                 s-^.*\*/--
  45.         }
  46.         /\/\*/b comment
  47. ' a |sed 's-//.*--'

  48. # 另外,可以用 gcc -E cfile

复制代码

论坛徽章:
0
6 [报告]
发表于 2007-01-16 15:12 |只看该作者
  1. # awk版

  2. awk '
  3. function clearComment(){

  4.         if ($0~/\/\*/){

  5.                 if ($0~/\*\//) sub(/\/\*.*\*\//, "");
  6.                 else sub(/\/\*.*/, "");
  7.                 print;

  8.                 while (getline == 1 && !($0~/\*\//));
  9.                
  10.                 sub(/.*\*\//, "");


  11.         } else if ($0~/\/\//) sub(/\/\/.*/, "");

  12.         if ($0~/\/\*/) clearComment();
  13.         else print;
  14. }

  15. {
  16.         clearComment();
  17. }' a
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP