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

时间:2013-05-12 14:00:14

标签: awk transformation gsub

我想修改与正则表达式匹配的字符串。 使用带有gsub的Awk,有“&”,表示匹配。有没有办法修改这个“匹配值:&”然后将它传递给gsub的第二个参数,以便它接受匹配,以某种方式替换它然后替换它? 也许这也可以用a:sed's /// g'?

来完成

例如:用“12.3”替换所有出现的“0.123e2”

2 个答案:

答案 0 :(得分:0)

在正常的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的第一次出现(现在为num.num e num),然后切断前导,匹配和尾随字符串(pme)。然后可以修改匹配的字符串(m)(现在它的格式为%.1f)。将前导和匹配部分添加到结果字符串(s),然后再次处理尾部。如果没有更多匹配的字符串,则打印结果。

答案 1 :(得分:0)

使用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