Parsing string em várias partes sem separador

0
115:wc -l:find . -iname "*test*":find /tmp/ -iname "*test*"

Eu gostaria de analisar a string acima.

No meu caso, uma string consiste em 4 colunas (cada comando tem : separador), mas pode ser muito mais longo. Eu quero "retirar" todos os comandos, incluindo o número inicial, começando com 115 e continuando com wc -l, -iname "*test*" , find /tmp/ -iname "*test*" ... sempre sem : separador.

Minha variável $var deve obter esses valores:

var= 115 , var= wc-l , var= find . -iname "*test*" , var= find /tmp/ -iname "*test*"

Meu código:

while read line;
 do
 while [[ $var -ne '0' ]];
   do
    var=$( echo $line | cut -d ':' -f$i )
    i=$( expr $i + 1 )
    echo $var
   done
done <$1

Eu li linhas de arquivo e com segundo enquanto eu cortei colunas até um vazio. Obviamente, há algo errado porque o eco não imprime nada.

    
por ZeroZek 19.05.2015 / 22:30

1 resposta

1

Aqui está o seu script fixo para funcionar do jeito que eu acho que você quis que funcionasse:

i=1     
while read line;                        
  do     
  while :; do 
    var=$( echo $line | cut -d ':' -f$i )                                   
    i=$( expr $i + 1 ) 
    [[ "$var" != "" ]] || break
    echo $var
  done     
done <$1

Algumas observações:

  • i não foi inicializado
  • var também não foi inicializado, portanto, o loop interno não seria executado nem uma vez
  • Não tenho certeza do que [[ $var -ne '0' ]] testa, mas acho que é melhor comparar $var com uma string vazia.
  • Como consequência, se houver um campo enpty (ou seja, dois dois pontos consecutivos), esse script terminará lá

Uma maneira mais robusta de fazer o mesmo é:

while read line; do
  num_fields=$(echo $line|awk -F':' '{print NF}')
  for (( i=1; i <= num_fields; i++ )); do
    var=$( echo $line | cut -d ':' -f$i )
    echo $var
  done
done <$1
    
por 20.05.2015 / 12:43