awkで脱出した区切り文字(コンマ)を無視しますか?
質問
逃げたコンマのような文字列があった場合:
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]
}
}
- 配列に分割されます
a
, 、使用する,
'デリミッターとして - アレイをビルドします
b
からa
, 、で終わるラインのマージ\
' - 印刷配列
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")
}
所属していません StackOverflow