我有一个文字
A1:B2.C3.D4.E5
A2:B7.C10.D0.E9
A0:B1.C9.D4.E8
我想知道如何改变它
A1:B2.C1.D4.E5
A2:B7.C8.D0.E9
A0:B1.C7.D4.E8
使用Awk。第一个问题是多个分隔符。第二,如何得到C值和递减2。
答案 0 :(得分:2)
awk解决方案:
$ awk -F"." '{$2=substr($2,0,1)""substr($2,2)-2;}1' OFS="." file
A1:B2.C1.D4.E5
A2:B7.C8.D0.E9
A0:B1.C7.D4.E8
答案 1 :(得分:1)
我想知道awk正则表达式是否可以完成这项任务,但显然,awk无法捕获模式。这就是我建议perl解决方案的原因:
$ cat data.txt
A1:B2.C3.D4.E5
A2:B7.C10.D0.E9
A0:B1.C9.D4.E8
$ perl -pe 's/C([0-9]+)/"C" . ($1-2)/ge;' data.txt
A1:B2.C1.D4.E5
A2:B7.C8.D0.E9
A0:B1.C7.D4.E8
答案 2 :(得分:1)
不可否认,我可能会使用像Guru所示的substr()
函数来完成此操作:
awk 'BEGIN { FS=OFS="." } { $2 = substr($2,0,1) substr($2,2) - 2 }1' file
我也喜欢Aif使用Perl的答案可能只是一点点。越短越甜,不是吗?但是,GNU awk
可以捕获图案。方法如下:
awk 'BEGIN { FS=OFS="." } match($2, /(C)(.*)/, a) { $2 = a[1] a[2] - 2}1' file