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

时间: 2024-10-10 06:49:52

awk 指定{}内x的替换的相关文章

AWK指定范围随机数函数

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.rand 是awk内置的随机数函数但只能生成 0-1 之间的随机数且无法定义生成范围,为解决 AWK指定范围随机数 的问题,定义了下面的 irand 的随机数函数. cat infile | awk -F " " ' function irand(min, max){     max= max - min + 1;     num= rand() * 1000000000;     retur

php中按指定标识及长度替换字符的方法代码

/** * 按指定标识及长度替换字符 * @param $str * @param int $start 开始的位数 * @param int $end 后面保留的位数 * @param string $mode * @return mixed */function _str_repeat($str=null, $start = 4, $end = 4, $mode = '*'){ if(!empty($str)){ $length = mb_strlen($str,'utf8')-$start

linux删除文件夹内指定名文件命令 替换文件内容

find ./test -name a.txt -exec rm -f {} \; sed -i "s#coban.com#bafangjie.cn#ig" `grep coban.com -i -rl *` sed -i "s#模板#更多模板#g" `grep 模板 -rl *` sed -i "s#href=\"\#\"#href=\"http://www.bafangjie.cn/\"#g" `gre

awk的内置函数

常见awk内置数值函数 ?? int(x):取整数部份,朝0的方向做舍去. ?? sqrt(x):正的平方根. ?? exp(x):以e为底的指数函数. ?? log(x):自然对数. ?? sin(x).cos(x):正弦.余弦. ?? atan2(y,x):求y/x 的arctan值,单位是弧度. ?? rand():得到一个随机数(平均分布在0和1之间) ?? srand(x):设定产生随机数的seed 为x 2) 常见awk内置字符串函数 ?? index(str,substr):返回子

awk指定行号和列号进行处理

这个做法是有问题的,会导致不应该有换行符的每一行都加上一个指定的换行符.待我再研究一下. 今天 在处理一堆SQL文件时遇到了这个问题. 首先是分隔符的问题,我遇到的两个分隔符一个是"`"(反引号)和"'"(单引号).这两个都是奇葩.先在这里指出. 分别是 awk -F"'" 'BEGIN{OFS="'\''"}{....}' filename awk -F"\`" 'BEGIN{OFS="`&qu

awk指定列修改

遇到个处理文本文件的问题 cat test.txt "355356"        "1700870"       "1"     "0202"  "" "355356"        "1700871"       "2"     ""    "02046" "355356"      

替换字符串括号外的所有特殊字符(括号内的不能替换)

eg:用-替-换字符串里的特殊字符,并进行切分(括号里的不能替换) String roads = "G6包头...?九原收费站((这个是..--..?测试)——210国道——幸福南路(备注:车.货.路线不变,往-返)——210国道(((aa)——210国道(这样呢)"; 一.思路:1.找到括号的区间范围 2.判断匹配内容是否在括号区间内,若在,不替换,若不在,替换 3.使用StringBuffer的替换,并且保证替换之前和替换之后的长度一致 4.若在括号内的,有特殊字符-的话,替换成*

【Oracle】导出全库备份,导入指定的schema并替换现有的表

需求:开发环境,每天晚上做了全库导出备份.由于误操作,现在要恢复指定的schema下的所有表,操作思路如下: 1.全库导出备份的语句 expdp system/oracle full=y dumpfile=arp103.$version.dmp logfile=arp103.$version.log directory=dmppath compression=ALL compression=ALL 是压缩备份的意思,节省空间. 2.导入备份语句: impdp system/oracle dump

python 简单实现工程内快速正则替换~~~~

写给自己看的,怕自己忘了 接到一个项目要搞移植,其中会牵涉到头文件引用问题,一个一个改太麻烦了,就决定用PYTHON的正则匹配替换.不过还不知道怎么能访问到一个文件夹的所有工程呢. 一.所以第一步尝试访问到文件夹目录下的所有文件 在PYTHON 2.7中采用OS.walk来完成 #coding=utf-8import osimport redir='dir'for root, subdirs, files in os.walk(dir):    print root #,subdirs,file