conta palavras em LIST sem separadores

1

Eu tenho o seguinte código ksh simples:

 MY_LIST=first,second,third
 NUM_IN_LIST=' echo $MY_LIST | sed s"/,/ /g" | wc -w '
 print $NUM_IN_LIST
 3
 [[ $NUM_IN_LIST = 3 ]] && print match

 but I dont get the match print -:(

talvez porque alguns espaços?

Posso obter outra sugestão para contar e imprimir as palavras em $ MY_LIST? (depois de remover o "," separador)

    
por jennifer 05.10.2010 / 11:59

2 respostas

0

Seu exemplo funciona para mim.

Aqui está uma alternativa:

MY_LIST=first,second,third
saveIFS=$IFS
IFS=','
array=($MY_LIST)
IFS=$saveIFS
NUM_IN_LIST=${#array[@]}
print $NUM_IN_LIST
[[ $NUM_IN_LIST = 3 ]] && print match
    
por 05.10.2010 / 12:18
1

Seu código deve funcionar, mas somente se $MY_LIST não contiver nenhum dos vários caracteres especiais:

  • echo $MY_LIST deve ser printf %s "$MY_LIST" ou print -r -- "$MY_LIST" . A falta de aspas informa ao shell para expor os caracteres globbing \*?[ . Ele também diz ao shell para dividir as palavras nos espaços, embora isso não importasse aqui, exceto pelo próximo problema.
  • O uso do echo também causa a interpretação de barras invertidas e um% principal- em algumas circunstâncias.
  • 'sed s "/, / / g" faz separadores de palavras de vírgulas e espaços.

Um problema adicional, explicando por que seu teste final não funciona, é que wc -w produz saída com espaços à esquerda, que são capturados em $NUM_IN_LIST . print $NUM_IN_LIST realiza a divisão de palavras em $NUM_IN_LIST , por isso acaba imprimindo apenas os dígitos; do print "$NUM_IN_LIST" para ver a diferença. A construção [[ … ]] inibe a divisão de palavras e = é um operador de comparação de cadeias, portanto, você está corretamente informado de que ' 3' não é a mesma coisa que '3' . [[ $NUM_IN_LIST -eq 3 ]] ou [ $NUM_IN_LIST = 3 ] teria sido verdade (mas nenhuma delas é uma solução real, são apenas soluções limitadas).

Uma maneira pura de mostrar o número de campos separados por vírgula é

commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}

Se alguém precisar de uma solução POSIX sh, substitua a primeira linha por commas=$(printf %s "$MY_LIST" | tr -dc ,) .

    
por 05.10.2010 / 23:38

Tags