2010-04-05 24 views

Respuesta

50

Desde read lee campos de espacio en blanco delimitado por defecto, una línea que contiene sólo espacios en blanco debe dar lugar a la cadena vacía que se asigna a la variable, por lo que debe ser capaz de saltar líneas vacías con solo:

[ -z "$line" ] && continue 
+4

(Más exactamente, el delimitador utilizado por 'leer' está determinado por la variable' IFS', que por defecto es el espacio en blanco. Simplemente desactive 'IFS' para volver a usar espacios en blanco.) – Arkku

+0

Todo genial es simple :) – planetp

+1

aún más simple: no necesita citar una línea, si usa la [[sintaxis] de bash: '[[-z $ línea]] && continuar' – pihentagy

4

bash:

if [[ ! $line =~ [^[:space:]] ]] ; then 
    continue 
fi 

Y el uso de done < file en lugar de cat file | while, a menos que sepa qué debería usar este último.

+0

necesito Smth que funcionaría tanto en bash y sh. ¿Hay alguna solución usando sh/sed/tr (en caso de que bash no esté instalado)? – planetp

2
if ! grep -q '[^[:space:]]' ; then 
    continue 
fi 
1

cat i inútil en este caso si está usando while read. No estoy seguro si quiso decir que quiere omitir las líneas que están vacías o si desea omitir las líneas que también contienen al menos un espacio en blanco.

i=0 
while read -r line 
do 
    ((i++)) # or $(echo $i+1|bc) with sh 
    case "$line" in 
    "") echo "blank line at line: $i ";; 
    *" "*) echo "line with blanks at $i";; 
    *[[:blank:]]*) echo "line with blanks at $i";; 
    esac 
done <"file" 
7

probar esto

while read line; 
do 

    if [ "$line" != "" ]; then 
     # Do something here 
    fi 

done < $SOURCE_FILE 
+4

Agregue algunas explicaciones, no solo el código. –

+0

Se puede encontrar más información sobre la notación de corchetes en [la página de prueba de manual] (http://man.cx/test) – c0dem4gnetic

Cuestiones relacionadas