原字符串
oxo{axbxc}oxo{dxexf}oxo
结果
oxo{a;b;c}oxo{d;e;f}oxo
- 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
- 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"变成";"符号。