2013-05-28 12 views
15

Chcę czytać wiersz po wierszu w skrypcie powłoki systemu Unix. Linia może zawierać spacje wiodące i końcowe i chcę czytać te spacje również w linii. Próbowałem z „linii podczas odczytu”, ale czytać polecenia usuwając spacje z wiersza :( przykładu, jeśli linia w pliku to: -Czytanie linii pliku po linii (z odstępem) w skrypcie powłoki Uniksa - numer

abcd efghijk 
abcdefg hijk 

linia powinna być odczytywana jako: - 1) "abcd efghijk" 2) " abcdefg hijk"

Co próbowałem to jest (co nie działało): -..

while read line 
do 
    echo $line 
done < file.txt 

Chcę linię tym spacje i tabulatory znaków w nim Proszę zaproponować sposób

Odpowiedz

22

Spróbuj tego,

IFS='' 
while read line 
do 
echo $line 
done < file.txt 

EDIT:

Od man bash

IFS - The Internal Field Separator that is used for word 
splitting after expansion and to split lines into words 
with the read builtin command. The default value is 
``<space><tab><newline>'' 
+0

To zadziałało! Dzięki. Plz wyjaśnić o IFS. –

+0

zaktualizował wpis. – sat

+7

Idiomatycznie, należy określić puste 'IFS' tylko dla instrukcji' read', aby uniknąć dziwnych efektów ubocznych: 'while IFS = read line' – l0b0

15

Chcesz przeczytać surowe linii, aby uniknąć problemów z ukośniki w wejściu (użyj -r) :

while read -r line; do 
    printf "<%s>\n" "$line" 
done < file.txt 

Spowoduje to zachowanie białych znaków w linii, ale usunie początkowe i końcowe spacje. Aby zachować te, a także ustawić IFS pusty, tak jak w

while IFS= read -r line; do 
    printf "%s\n" "$line" 
done < file.txt 

To teraz jest odpowiednikiem cat < file.txt dopóki file.txt kończy się nową linią.

Pamiętaj, że musisz podwójnie zacytować "$line", aby podzielić podział słów na oddzielne słowa - w ten sposób tracąc wiele białych znaków.

+0

Dzięki za opisanie tego. –

+2

@SourabhSaxena Nie ma za co. Sposobem wyrażenia "podziękowania" na Stackoverflow jest przejęcie, klikając strzałkę w górę po lewej stronie odpowiedzi. – Jens

Powiązane problemy