我正在尝试编写一个脚本,将行中的每个数字都减少“ 1”,但我却得到了所有“ 0”:
awk '{a=gensub(/([0-9]+)/,"\\1","g",$0);
if(a~/[0-9]+/) {gsub(/[0-9]+/,a-1,$0);}
print $0}'
例如,字符串:
1,2,3,4-7
应导致:
0,1,2,3-6
相反,我得到:
0,0,0,0-0
awk
替代功能非常有限。gawk
具有gensub()
至少可以包括替换中的匹配部分的部分,但是不能对其进行任何操作。
可以使用awk
,但您需要采用其他方法:
awk '{
text = $0
$0 = ""
while (match(text, /[0-9]+/)) {
$0 = $0 substr(text, 1, RSTART-1) \
(substr(text, RSTART, RLENGTH) - 1)
text = substr(text, RSTART+RLENGTH)
}
$0 = $0 text
print}'
或者使用GNUawk
作为@jofel方法的一种变体:
gawk -v 'RS=[0-9]+' '{printf "%s", $0 (RT==""?"":RT-1)}'
或者
gawk -v 'RS=[^0-9]+' '{printf "%s",($0==""?"":$0 - 1)RT}'
但是,使用perl
以下命令会容易得多:
perl -pe 's/\d+/$&-1/ge'
perl
可以使用捕获组(如$1
,$2
...以及$&
整个匹配部分),并且带有e
标志可以使用捕获组运行任意perl
表达式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句