2011-01-27 4 views
5

Ho un file file.txt con contenuti comeCome leggere tutta la linea da bash

i love this world 

I hate stupid managers 
I love linux 

I have MS 

Quando faccio la seguente:

for line in `cat file.txt`; do 
echo $line 
done 

Dà output come

I 
love 
this 
world 
I 
.. 
.. 

Ma Ho bisogno dell'output come intere linee come sotto — qualche idea?

i love this world 

I hate stupid managers 
I love linux 

I have MS 
+2

tua domanda si legge come si vuole solo fare 'cat file.txt' –

+0

I secondo Zac, ci deve essere qualcosa di più complesso che devi fare qui, e v'è probabilmente anche già un Unix tool to do it – tobyodavies

+0

Siamo spiacenti, potrebbe essere che dovrei avere più chiaro, ho bisogno di ottenere linee e linee e analizzare questa linea.Quindi gatto non sarà utile nel mio caso. –

risposta

10
while read -r line; do echo "$line"; done < file.txt 
+0

+1. Solitamente vorrete usare 'read -r'. –

+0

Grazie, buona cattura (di nuovo) – SiegeX

6

Come @Zac notato nei commenti, la soluzione più semplice al problema di postare è semplicemente cat file.txt quindi devo supporre ci sia qualcosa di più interessante in corso e quindi ho messo le due opzioni che risolvono il domanda come chiesto così:

ci sono due cose che puoi fare qui, o si può impostare IFS (separatore campo interno) per una nuova riga e utilizzare il codice esistente, oppure è possibile utilizzare il comando read o line in un ciclo while

IFS=" 
" 

o

(while read line ; do 
    //do something 
done) < file.txt 
+4

'IFS = $ '\ n'' è più leggibile. Non è necessario inserire il ciclo 'while' in una subshell. –

+0

funziona Dennis ?? Ho provato a mettere le mie impostazioni di "IFS" su una riga per mesi e ho rinunciato perché pensavo che non si potesse fare! – tobyodavies

+1

Trovo la notazione '(...)' un po 'più facile da leggere e le prestazioni raramente sono una considerazione negli script di bash. – tobyodavies

-1

Prova

(while read l; do echo $l; done) < temp.txt 

lettura: legge una riga dal standard input e dividerlo in campi.

Legge una linea dall'input standard o dal file descrittore FD se l'opzione -u è fornita. La riga viene divisa in campi come con la divisione e la prima parola viene assegnata al primo NAME, la seconda parola al secondo NAME e così via, con qualsiasi parola residua assegnata a a l'ultimo NAME. Solo i caratteri trovati in $ IFS sono riconosciuti come delimitatori di parola .

+0

Non è necessario (e non dovrebbe uso) i paren, questi crea un sotto-guscio superfluo. Inoltre, non ti ho dato il -1 ma sto indovinando il motivo per cui qualcuno ha fatto è stato perché la tua risposta è un mio duplicato esatto dato qualche minuto prima. – SiegeX

+0

Personalmente mi piace la notazione '(...)', trovo che sia molto più facile da leggere ... e gli speedup nella regione di 1ms sono raramente utili in bash – tobyodavies

+0

@Siege: Naturalmente, uno si avvicina risposte ovvie allo stesso tempo (il tuo non era in giro quando ho composto, non citando 'help read 'avrei salvato un minuto, ma cui bono?) –

1

È possibile farlo leggendo se il file sta entrando in stdin. Se è necessario farlo nel mezzo di uno script che già utilizza stdin per altri scopi, è possibile riassegnare temporaneamente il descrittore del file stdin.

#!/bin/bash 
file=$1 

# save stdin to usually unused file descriptor 3 
exec 3<&0 

# connect the file to stdin 
exec 0<"$file" 

# read from stdin 
while read -r line 
do 
    echo "[$line]" 
done 

# when done, restore stdin 
exec 0<&3 
+0

c'è qualcosa di sbagliato nel reindirizzare al ciclo while ?? – tobyodavies

+0

no, basta aggiungere un approccio diverso per evidenziare la manipolazione del descrittore di file che è esoterico ma ha i suoi usi. – thatbrentguy

+0

... per esempio, se volessi chiamare qualche funzione di libreria già scritta per usare stdin ma volevi che fosse disegnata da un file, potresti usare questa tecnica per farlo senza dover ricodificare la funzione – thatbrentguy

1

Credo che la domanda fosse come leggere un'intera riga alla volta. Lo script semplice sotto farà questo. Se non si specifica un nome di variabile per "read", verrà riempita l'intera riga nella variabile $ REPLY.

cat file.txt | while read; fai echo $ RISPOSTA; fatto

Dave ..

+0

Si noti inoltre che in questo modo, il controllo viene anche restituito alla CLI dopo che il file è stato letto. Ciò è particolarmente importante se si esegue il piping del risultato di un comando su "while" anziché su un file, che ha un EOF, l'output CLI non lo fa e lascerebbe il comando in attesa di altro. Ad esempio: 'find. -name 'readme.txt' | mentre leggi linea; fai echo $ line; done' (restituito all'utente) vs 'mentre legge riga; fai echo $ line; fatto | trova . -name 'readme.txt'' (attende l'input) –