我正在尝试使用分隔符' |'来分割字符串。但是,我想得到' |'来自第二个示例中的示例数据。我怎样才能做到这一点?
f() {
local IFS='|'
local foo
set -f # Disable glob expansion
foo=( $@ ) # Deliberately unquoted
set +f
printf '%d\n' "${#foo[@]}"
printf '%s\n' "${foo[@]}"
}
f 'un|dodecaedro|per|||tirare|per|i danni'
预期产出:
un
dodecaedro
per
|
tirare
per
i danni
答案 0 :(得分:1)
从awk获取此输出的粗略方式:
s='un|dodecaedro|per|||tirare|per|i danni'
awk '{p=$0; while ((n=index(p, "|"))) { m=(n==1)?n:n-1; print substr(p, 1, m);
p=substr(p, n+1)}; print p }' <<< "$s"
un
dodecaedro
per
|
|
tirare
per
i danni
答案 1 :(得分:1)
可能有一些很好的方式来产生你的期望,这是我的方法,我希望你使用最新版本的bash,这里支持字符串
string='un|dodecaedro|per|||tirare|per|i danni'
awk '{
n=split($0,A,"|")
for(i=1;i<=n;i++)
{
if(length(A[i]) == 0 && length(A[i+1])==0)
{
print "|"; i+=1
}
else
{
print A[i]
}
}
}' <<<"$string"
<强>所得强>
$ bash f
un
dodecaedro
per
|
tirare
per
i danni
答案 2 :(得分:0)
您可以尝试使用sed
简单地替换两个连续的换行符(由set
解析并输出\n
作为分隔符){{1在事实之后(但@Ed Morton的警告适用于歧义):
\n|
答案 3 :(得分:0)
让我们看看“真正的”CSV解析器如何处理这些数据:
echo 'un|dodecaedro|per|||tirare|per|i danni' |
ruby -rcsv -ne 'puts CSV.parse_line($_, :col_sep=>"|").join("\n")'
un
dodecaedro
per
tirare
per
i danni
如果我们在“麻烦”字段中使用引号怎么办:
echo 'un|dodecaedro|per|"|"|tirare|per|i danni' |
ruby -rcsv -ne 'puts CSV.parse_line($_, :col_sep=>"|").join("\n")'
un
dodecaedro
per
|
tirare
per
i danni
因此,您必须确保您的数据处于干净状态优先。