如何从正则表达式匹配的数字中减去1?

马克斯·谢佩列夫

我正在尝试编写一个脚本,将行中的每个数字都减少“ 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
斯蒂芬·查泽拉斯(Stephane Chazelas)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章