2013-08-05 11 views
9

Mam plik źródłowy, który jest połączeniem wielu plików, które zostały połączone. Mój skrypt ma rozdzielić je na oryginalne pojedyncze pliki.Jak zachować wiodące białe znaki za pomocą echa w skrypcie powłoki?

Ilekroć napotykam linię rozpoczynającą się od "FILENM", oznacza to, że jest to początek następnego pliku.

Wszystkie wiersze szczegółów w plikach mają ustaloną szerokość; obecnie napotykam problem polegający na tym, że linia zaczynająca się od początkowych białych znaków jest obcinana, gdy nie ma być obcięta.

Jak poprawić ten skrypt, aby zachować wiodące spacje?

while read line   
do   
    lineType=`echo $line | cut -c1-6` 
    if [ "$lineType" == "FILENM" ]; then 
     fileName=`echo $line | cut -c7-` 
    else 
     echo "$line" >> $filePath/$fileName 
    fi 
done <$filePath/sourcefile 

Odpowiedz

18

Spacje wiodące są usuwane, ponieważ read dzieli dane wejściowe na słowa. Aby temu zaradzić, ustaw zmienną IFS na pusty ciąg znaków. Tak:

OLD_IFS="$IFS" 
IFS= 
while read line   
do 
    ... 
done <$filePath/sourcefile 
IFS="$OLD_IFS" 
7

Aby zachować IFS zmienną można napisać while w następujący sposób:

while IFS= read line 
do 
    . . . 
done < file 

także zachowania backslashe używać read -r opcję.

+0

Zasługujesz na oskarę. – xdevs23

Powiązane problemy