Como posso pular arquivos vazios com sed?

1

Estou usando sed assim:

 sed -e 's/ *| */|/g'
   ${array_export_files[$loopcount]}>>$TEMPDIR/"export_file"_${testid}_${loopcount}_$$

sob um loop while, mas os problemas surgem quando o arquivo está vazio ou não contém nada.

  1. Eu não quero que o sed seja executado se o arquivo existir, mas estiver vazio;
  2. Eu não quero que o sed seja executado se o arquivo não existir.

O trecho de código completo é

while [ $loopcount -le $loopmax ]
do 
    if [ "$loopcount" -eq "$loopcount" ]
    then
        sed -e 's/ *| */|/g' ${array_export_files[$loopcount]}>>$TEMPDIR/"export_file"_${testid}_${loopcount}_$$
        tr "|" "\t" <"export_file"_${testid}_${loopcount}_$$>${array_export_files[$loopcount]}
        cp ${array_export_files[$loopcount]} "export_file"_${loopcount}_${testid}
        echo "Testing Starts Here"
        echo ${array_export_files[$loopcount]} "export_file"_${loopcount}_${testid}
        echo "Testing Ends Here"
    fi
  (( loopcount='expr $loopcount+1'))
done    

Portanto, não posso substituir ou usar o operador AND na declaração acima, se houver alguma maneira de resolver isso? Se eu usar o operador AND, ele pode pular a seção de código inteira abaixo, nem executar. Eu só queria ignorar a seção sed condicionalmente.

    
por Aman 01.04.2015 / 12:50

1 resposta

3

Bash tem a opção -s para testar a existência e tamanho maior que zero:

 -s file
          True if file exists and has a size greater than zero.

para que você possa fazer

if [ -s "${array_export_files[$loopcount]}" ]; then
   sed .......
fi

dentro do loop. Como o if [ "$loopcount" -eq "$loopcount" ] é sempre verdadeiro, você pode substituí-lo:

while [ "$loopcount" -le "$loopmax" ]
do 
    if [ -s "${array_export_files[$loopcount]}" ]
    then
        sed -e 's/ *| */|/g' "${array_export_files[$loopcount]}" >>" $TEMPDIR/export_file_${testid}_${loopcount}_$$"
        tr "|" "\t" <"export_file_${testid}_${loopcount}_$$">"${array_export_files[$loopcount]}"
        cp "${array_export_files[$loopcount]}" "export_file_${loopcount}_${testid}"
        echo "Testing Starts Here"
        echo "${array_export_files[$loopcount]}" "export_file_${loopcount}_${testid}"
        echo "Testing Ends Here"
    fi
    (( loopcount = loopcount + 1 ))
done
    
por 01.04.2015 / 12:57