0

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

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

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

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

3 回答 3

2
{
  gsub("\\\\,", "!Q!")
  n = split($0, a, ",")
  for (i = 1; i <= n; ++i) {
    gsub("!Q!", "\\,", a[i])
    print a[i]
  }
}
于 2009-09-23T20:22:02.527 回答
2
{
   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. b从构建数组,合并以 ' 'a结尾的行\
  3. 打印数组b(注意:从 2 开始,因为第一项为空白)

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

于 2009-09-23T20:29:26.237 回答
1

我不认为 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")
}
于 2009-09-23T20:27:15.860 回答