質問

逃げたコンマのような文字列があった場合:

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

awkを使用してそれを次のアイテムに解析するにはどうすればよいですか?

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. アレイをビルドします b から a, 、で終わるラインのマージ\'
  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