awk 指定{}内x的替换

Posted 陈浩然MC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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标签处。

 
原文地址:http://blog.chinaunix.net/uid-10540984-id-4772034.html

以上是关于awk 指定{}内x的替换的主要内容,如果未能解决你的问题,请参考以下文章

grep/sed/awk - 用新的计算值“$X/10”替换文件中的所有“$X”

替换不在括号中的数字?

替换jar包内指定的文件

awk从入土到入门(10)awk内置函数

awk用法之:文本替换

awk 基本函数用法