使用正则表达式作为分隔符时如何打印回正确的分隔符?

使用正则表达式作为分隔符时如何打印回正确的分隔符?

我的线条看起来像这样

123-456-789 12.34.56 example

我想选择 12,添加 2,然后按原样打印整行。所以结果应该是:

123-456-789 14.34.56 example

我有这个 awk 表达式:

awk 'BEGIN {FS="[ .]"}{$2=$2+2}{print}'

但它给了我

123-456-789 14 34 56 example

点消失了,取而代之的是空格。

答案1

awk '{ split($2,a,"\."); a[1]+=2; $2=sprintf("%d.%d.%d", a[1],a[2],a[3]) } 1' file

或者,

awk '{ split($2,a,"\."); $2=sprintf("%d.%d.%d", a[1] + 2,a[2],a[3]) } 1' file

这会将行读取为一组空格分隔的字段。它将第二个字段按点分割,并将结果的第一部分加 2。然后,在打印结果记录之前,它将第二个字段重新形成为三个点分隔的整数(打印是由末尾的 完成的,1这是一种快捷方式{ print })。

这假设我们知道第二条记录确实是三个点分隔的整数。

我会这样做,因为它所发生的事情非常明确,因此易于理解和维护。

答案2

尝试去 ”恢复" 复杂/复合字段分隔符可能会破坏某些值和整个记录的一致性。
相反,请使用以下方法:

awk '{ n = substr($2, 1, index($2, ".")); sub(/[^.]+\./, n + 2 ".", $2) }1' file

输出:

123-456-789 14.34.56 example

上面的命令将使用空格作为默认字段分隔符,并$2仅对第二个字段执行所有需要的处理。

答案3

在脚本中使用允许捕获字段分隔符的split函数:awk

 awk '{split($0,a,"[- .]",sep); a[4]+=2; for(i in a) printf "%s%s",a[i], sep[i]; printf "\n"}' file

或者,您可以使用RSRT变量

 awk -v RS='[- .]' 'NR==4{$1+=2} {printf "%s%s",$0,RT}' file <<< '123-456-789 12.34.56 example'

请注意,最后一个仅适用于单行。

答案4

与 gensub 的 gawk 一起

gawk '{sub(/[^.]*/,gensub(/([^.]*).*/,"\\1",1,$2)+2,$2)}1' infile

相关内容