【问题标题】:awk/sed - transforming regex-matchesawk/sed - 转换正则表达式匹配
【发布时间】:2013-05-12 14:00:13
【问题描述】:

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

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

【问题讨论】:

  • 您的问题是什么?能举个例子吗?
  • 您的目标是否只是修复所有浮点数的格式(可能在文件中)?

标签: awk transformation gsub


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在普通的 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),然后再次处理尾随部分。如果没有更多匹配的字符串,则打印结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-23
      • 2018-12-30
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 2014-09-06
      相关资源
      最近更新 更多