【问题标题】:Ignoring escaped delimiters (commas) with awk?用awk忽略转义分隔符(逗号)?
【发布时间】:2009-09-23 19:53:21
【问题描述】:

如果我有一个带有转义逗号的字符串,如下所示:

a,b,{c\,d\,e},f,g

我如何使用 awk 将其解析为以下项目?

a
b
{c\,d\,e}
f
g

【问题讨论】:

    标签: awk delimiter escaping


    【解决方案1】:
    {
       split($0, a, /,/)
       j=1
       for(i=1; i<=length(a); ++i) {
          if(match(b[j], /\\$/)) {
             b[j]=b[j] "," a[i]
          } else {
             b[++j] = a[i]
          }
       }
       for(k=2; k<=length(b); ++k) {
          print b[k]
       }
    }
    
    1. 拆分成数组a,使用','作为分隔符
    2. a 构建数组b,合并以“\”结尾的行
    3. 打印数组b(注意:由于第一项为空白,因此从 2 开始)

    此解决方案假定(目前)“,”是唯一一个用“\”转义的字符——也就是说,不需要处理输入中的任何\\,也不需要处理奇怪的组合,例如\\\,\\,\\\\,,\,

    【讨论】:

      【解决方案2】:
      {
        gsub("\\\\,", "!Q!")
        n = split($0, a, ",")
        for (i = 1; i <= n; ++i) {
          gsub("!Q!", "\\,", a[i])
          print a[i]
        }
      }
      

      【讨论】:

      • 只要您从不在您的文本中包含!Q!,这将起作用。
      【解决方案3】:

      我不认为 awk 对这样的东西有任何内置支持。这是一个不像 DigitalRoss 那样短的解决方案,但应该不会有意外击中您编造的字符串 (!Q!) 的危险。由于它使用if 进行测试,因此您还可以对其进行扩展以小心您的字符串末尾是否真的有\\,,这应该是一个转义的斜杠,而不是逗号。

      BEGIN {
          FS = ","
      }
      
      {
          curfield=1
          for (i=1; i<=NF; i++) {
              if (substr($i,length($i)) == "\\") {
                  fields[curfield] = fields[curfield] substr($i,1,length($i)-1) FS
              } else {
                  fields[curfield] = fields[curfield] $i
                  curfield++
              }
          }
          nf = curfield - 1
          for (i=1; i<=nf; i++) {
              printf("%d: %s   ",i,fields[i])
          }
          printf("\n")
      }
      

      【讨论】:

      • 我认为这就是您感兴趣的所有拆分,因此将 FS 设置为以逗号拆分。如果您尝试仅对子字符串执行此操作,请使用系统 PAUSE 版本的相同方法。
      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2021-06-08
      相关资源
      最近更新 更多