Diyelim ki bu dosyanız var:
$ cat /tmp/test.txt
Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR
Birçok Bash çözümü tarafından okunan dosya çıktısının anlamını değiştirecek dört öğe vardır:
- Boş satır 4;
- İki satırda öndeki veya sondaki boşluklar;
- Tek tek satırların anlamını korumak (yani her satır bir kayıttır);
- Çizgi 6 bir CR ile sonlandırılmadı.
Metin dosyasının boş satırlar ve CR içermeyen sonlandırma satırları da dahil olmak üzere satır satır olmasını istiyorsanız, while döngüsü kullanmalı ve son satır için alternatif bir testiniz olmalıdır.
İşte dosyayı değiştirebilecek yöntemler ( cat
döndürenlere ):
1) Son çizgiyi ve ön ve arka boşlukları kaybedin:
$ while read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
(Bunu yaparsanız while IFS= read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
, önde gelen ve arkadaki boşlukları korursunuz, ancak CR ile sonlandırılmazsa son satırı kaybedersiniz)
2) İşlem ikamesi ile birlikte kullanıldığında cat
, tüm dosya tek bir yığında okunacak ve satırların anlamı kaybedilecektir:
$ for p in "$(cat /tmp/test.txt)"; do printf "%s\n" "'$p'"; done
'Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR'
(Eğer kaldırırsanız "
dan $(cat /tmp/test.txt)
size ziyade bir yudum daha kelime dosya kelimeyi okuyun. Ayrıca amaçlanan muhtemelen neyi ...)
Bir dosyayı satır satır okumanın ve tüm boşlukları korumanın en sağlam ve basit yolu:
$ while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
' Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space '
'Line 6 has no ending CR'
Öncü ve ticaret alanlarını soymak istiyorsanız, IFS=
parçayı çıkarın :
$ while read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
'Line 6 has no ending CR'
Bir sonlandırıcı olmadan (bir metin dosyası \n
, oldukça yaygın iken, POSIX altında kırık olarak kabul edilir. Eğer sondaki güvenebilirsiniz varsa \n
size ihtiyacım yok || [[ -n $line ]]
içindewhile
döngü.)
Daha fazla bilgi için BASH SSS