awk/sed-转换正则表达式匹配

awk/sed-转换正则表达式匹配,awk,transformation,gsub,Awk,Transformation,Gsub,我想修改与正则表达式匹配的字符串。 将Awk与gsub一起使用时,会出现表示匹配的“&”。是否有办法修改此“匹配值:&”,然后将其传递给gsub的第二个参数,以便它获取匹配项,以某种方式替换它,然后替换它? 也许这也可以用像a:sed's///g'这样的东西来实现 例如:在正常awk中,将“0.123e2”等所有事件替换为“12.3”您可以尝试以下方法来处理所有数值: awk ' { s=""; e = $0 while (match(e, /(+|-)?[[:digit:

我想修改与正则表达式匹配的字符串。 将Awk与gsub一起使用时,会出现表示匹配的“&”。是否有办法修改此“匹配值:&”,然后将其传递给gsub的第二个参数,以便它获取匹配项,以某种方式替换它,然后替换它? 也许这也可以用像a:sed's///g'这样的东西来实现


例如:在正常awk中,将“0.123e2”等所有事件替换为“12.3”

您可以尝试以下方法来处理所有数值:

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
它搜索RE的第一个匹配项(现在是
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

你的问题是什么?你能举个例子吗?你的目标仅仅是修复所有浮点数的格式(可能在一个文件中)?
$ 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