• awk 指定{}内x的替换


    替换{}中的x为;
     
    原字符串
    oxo{axbxc}oxo{dxexf}oxo
    结果
    oxo{a;b;c}oxo{d;e;f}oxo
     
     
    awk '{for(i=1;i<=NF;i++){if($i=="{")j=1;if($i=="}")j=0;if($i=="x" && j)$i=";";print $i}}' test
    分解,使用for循环记录字符串的每个字符,进行匹配,满足条件{,进入替换模式,再次进行匹配},满足条件循环结束;打印;打印使用printf会更好
     ############awk的思路更容易被理解,for循环逐个字符判断,匹配到 { 符号就做一个记号设置变量j=1,当j作为逻辑判断条件为真是把"x"变成";"符号。
    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 ""}
     
    下面是sed的替换,一直没看懂,摘自CU的大神   zooyo 的博客

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

     
  • 相关阅读:
    【centos6.5 安装 node.js + npm】
    【钉钉PC】PC端钉钉清除缓存
    【laravel5.4】中jquery的post Ajax提交
    python 设计模式之中介者模式
    python 设计模式之备忘录模式
    python 设计模式之观察者模式
    python 设计模式之策略模式
    23种设计模式有哪些,不带定义,不带例子
    python 设计模式之模板方法模式
    python 设计模式之访问者模式
  • 原文地址:https://www.cnblogs.com/irockcode/p/6747049.html
Copyright © 2020-2023  润新知