在 POSIX awk 中实现 `maxsplit` 函数

问题描述 投票:0回答:1

我正在尝试实现一个 awk 函数,用于将字符串拆分为数组;与内置

split
的主要区别在于,可以限制执行的“拆分”数量,就像 Python 中的
str.split

原型会是这样的:

maxsplit(s, a, n[, fs ])
将字符串

s
拆分为数组元素,最多执行
n
次拆分(因此,数组最多有
n+1
个元素
a[1]
,
a[2]
, ...,
a[n+1]
),并返回数组中元素的实际数量。在执行分割之前,应删除数组的所有元素。分隔应使用 ERE
fs
或使用字段分隔符
FS
(如果未给出
fs
)来完成。
空字符串作为
fs
值的效果未指定。

这是我想出的代码(未完全测试):

function maxsplit(s,a,n,fs,    i,j) {
    delete a
    if (fs == "")
        fs = FS
    if (fs == " ")
    {
        for (i = 1; i <= n && match(s,/[^[:space:]]+/); i++) {
            a[i] = substr(s,RSTART,RLENGTH)
            s = substr(s,RSTART+RLENGTH)
        }
        sub(/[[:space:]]+/,"",s)
    }
    else if (length(fs) == 1)
    {
        for (i = 1; (i <= n) && (j = index(s,fs)); i++) {
            a[i] = substr(s,1,j-1)
            s = substr(s,j+1)
        }
    }
    else
    {
        for (i = 1; (i <= n) && (match(s,fs)); i++) {
            a[i] = substr(s,1,RSTART-1)
            s = substr(s,RSTART+RLENGTH)
        }
    }
    if (s != "") {
        a[i] = s
        return i
    } else {
        return i-1
    }
}

如您所见,我一直在添加不同的代码路径来处理不同类型的

fs
。我的问题是:还有哪些其他“边界情况”需要处理?

awk posix
1个回答
0
投票

还有哪些其他“边界情况”需要处理?

我会指出

n
等于
0
,在
python
中,这会导致
list
具有一个元素,即整个文本,例如

text = "Able Baker Charlie"
split = text.split(maxsplit=0)
print(split)  # ['Able Baker Charlie']
© www.soinside.com 2019 - 2024. All rights reserved.