首页 > 代码库 > awk 指定{}内x的替换
awk 指定{}内x的替换
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标签处。
awk 指定{}内x的替换