2011-09-06 8 views

risposta

70
IFS='' 
cat test.file | 
while read data 
do 
    echo "$data" 
done 

Mi rendo conto che si potrebbe avere semplificato l'esempio da qualcosa che davvero bisogno di un oleodotto, ma prima che qualcun altro dice:

IFS='' 
while read data; do 
    echo "$data" 
done < test.file 
+0

Poiché lo script sta leggendo in una singola variabile per riga, qualsiasi spazio all'interno dei dati (dopo il primo non vuoto) viene mantenuto a prescindere. Ma l'IFS vuoto conserva gli spazi iniziali (in ksh e bash). –

+15

Questo è un posto dove è possibile scrivere 'while IFS = leggere i dati; ... ' –

+0

@glennjackman Stavo iniziando a provare 'export IFS' ..., bene ho letto la tua mancia! –

1

read data suddivide i dati per IFS, che in genere è "\ t \ n". Ciò manterrà gli spazi vuoti per voi:

var=$(cat test.file) 
echo "$var" 
0

In alternativa, utilizzare un buon file di strumento di analisi, come awk

awk '{ 
# do your stuff 
print 
}' file 
2

Giusto per completare res di DigitalRoss ponse. In questo caso che si desidera modificare l'IFS solo per questo comando è possibile utilizzare le parentesi graffe. Se lo fai, il valore di IFS verrà modificato solo all'interno del blocco. Ti piace questa:

(spazi mantenere)
echo ' 
    word1 
    word2' | { IFS='' ; while read line ; do echo "$line" check ; done ; } 

L'uscita sarà:

word1 check 
    word2 check 
+0

Anche se unset 'IFS' recupera già questo particolare esempio, dovresti comunque citare' "$ line" '. In un esempio reale, il valore potrebbe contenere ancora caratteri jolly della shell e cosa no. – tripleee

8

In realtà, se non si fornisce un argomento per la chiamata "leggere", leggere sarà impostare una variabile di default chiamato $ REPLY che preserverà gli spazi bianchi. Quindi puoi fare questo:

$ cat test.file | while read; do echo "$REPLY"; done 
+1

Questo è bello sapere. Non so perché hai un downvote. Forse non è affidabile, non so se è lo stesso su tutte le piattaforme. A volte è bene sapere perché si ottiene un downvote. – 244an

+0

Questa risposta mi ha spinto a leggere attentamente la documentazione di 'read'. –

+0

Questo non conserva gli spazi bianchi * iniziali * che è ciò che OP sta cercando –

Problemi correlati