Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3023794
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2015-01-21 00:00:47

替换{}中的x为;  

原字符串
oxo{axbxc}oxo{dxexf}oxo 

结果
oxo{a;b;c}oxo{d;e;f}oxo 



  1. sed ':1;s/\(.*{[^}]*\)x\(.*\)/\1;\2/;t1'
[解析]
   这个问题的难点主要是在于同一行内替换,大家都知道awk和sed都是根据行来操作的,同一行内操作比较花力气一点,大家可以看看sedsed的执行结果:
  1. PATT:oxo{axbxc}oxo{dxexf}oxo$
  2. COMM::1
  3. COMM:s/\(.*{[^}]*\)x\(.*\)/\1;\2/
  4. PATT:oxo{axbxc}oxo{dxe;f}oxo$
  5. COMM:t 1
  6. COMM:s/\(.*{[^}]*\)x\(.*\)/\1;\2/
  7. PATT:oxo{axbxc}oxo{d;e;f}oxo$
  8. COMM:t 1
  9. COMM:s/\(.*{[^}]*\)x\(.*\)/\1;\2/
  10. PATT:oxo{axb;c}oxo{d;e;f}oxo$
  11. COMM:t 1
  12. COMM:s/\(.*{[^}]*\)x\(.*\)/\1;\2/
  13. PATT:oxo{a;b;c}oxo{d;e;f}oxo$
  14. COMM:t 1
  15. COMM:s/\(.*{[^}]*\)x\(.*\)/\1;\2/
  16. PATT:oxo{a;b;c}oxo{d;e;f}oxo$
  17. COMM:t 1
  18. PATT:oxo{a;b;c}oxo{d;e;f}oxo$
  19. oxo{a;b;c}oxo{d;e;f}oxo
根据正则的贪婪性,是从后往前替换的,能替换成功的关键在于.*{[^}]*\)x\(.*\),首先要替换 { 之后的x,而且在之中不能有 } 字符,所以像{axbxc}oxo这样的 x 是不会被匹配到的,因为我们排除了 } 字符,替换成功后 t 跳转到lable标签处。


  1. awk -F "" '{for(i=1;i<=NF;i++){if($i=="{")j=1;if($i=="}")j=0;if(j && $i=="x")$i=";";printf $i}}END{print ""}
[解析]
    awk的思路更容易被理解,for循环逐个字符判断,匹配到 { 符号就做一个记号设置变量j=1,当j作为逻辑判断条件为真是把"x"变成";"符号。


阅读(9523) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~