如果我有一个带有逃逸逗号的字符串:这样:

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

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

a
b
{c\,d\,e}
f
g
有帮助吗?

解决方案

{
   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. 构建数组 ba, ,结束以'\'
  3. 打印阵列 b (注意:第2个开始,因为第一项是空白的)

该解决方案假设(目前),“是唯一逃脱的角色”\' - 也就是说,无需处理任何 \\ 在输入中,诸如 \\\,\\,\\\\,,\,.

其他提示

{
  gsub("\\\\,", "!Q!")
  n = split($0, a, ",")
  for (i = 1; i <= n; ++i) {
    gsub("!Q!", "\\,", a[i])
    print a[i]
  }
}

我认为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")
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top