题
如果我有一个带有逃逸逗号的字符串:这样:
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]
}
}
- 分为数组
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