我想修改匹配正则表达式的字符串。将 awk 与 gsub 一起使用,有“&”,表示匹配。有没有办法修改这个“匹配值:&”,然后将它传递给gsub的第二个参数,使其接受匹配,以某种方式替换它,然后替换它?也许这也可以用类似的东西来完成: sed 's///g' ?
例如:用“12.3”替换所有出现的“0.123e2”
我想修改匹配正则表达式的字符串。将 awk 与 gsub 一起使用,有“&”,表示匹配。有没有办法修改这个“匹配值:&”,然后将它传递给gsub的第二个参数,使其接受匹配,以某种方式替换它,然后替换它?也许这也可以用类似的东西来完成: sed 's///g' ?
例如:用“12.3”替换所有出现的“0.123e2”
在普通的 awk 中,您可以尝试这样的方法来处理所有数值:
awk '
{
s=""; e = $0
while (match(e, /(+|-)?[[:digit:]]+\.[[:digit:]]+e(+|-)?[[:digit:]]+/)) {
p=substr(e, 1, RSTART-1);
m=substr(e, RSTART, RLENGTH);
e=substr(e, RSTART+RLENGTH);
# Modify mathed data
s = s p sprintf("%.1f", m);
}
print s e
}' <<XXX
0.123e2 0.234e5
-12298.345e-3 some
0.234 number
XXX
输出
12.3 23400.0
-12.3 some
0.234 number
它搜索第一次出现的 RE(now num.num e num
),然后切断前导、匹配和尾随字符串(p
, m
, e
)。m
然后可以修改匹配的字符串( )(现在它只是格式化为%.1f
)。添加到结果字符串 ( s
) 的前导和匹配部分,然后再次处理尾随部分。如果没有更多匹配的字符串,则打印结果。
使用 GNU awk:
$ cat file
foo 0.123e2 bar 0.123e2
$ gawk '{print gensub(/0.(12)(3)e2/,"\\1.\\2","g")}' file
foo 12.3 bar 12.3