使用分隔符拆分字符串

时间:2014-04-06 17:10:45

标签: linux bash awk

我正在尝试使用分隔符' |'来分割字符串。但是,我想得到' |'来自第二个示例中的示例数据。我怎样才能做到这一点?

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 

4 个答案:

答案 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

因此,您必须确保您的数据处于干净状态优先