2011-09-06 25 views

Trả lời

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

Tôi nhận ra rằng mình có thể đã đơn giản hóa ví dụ từ một cái gì đó thực sự đang rất cần một đường ống, nhưng trước khi người khác nói nó:

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

Do tập lệnh được đọc thành một biến duy nhất trên mỗi dòng, bất kỳ khoảng trắng nào trong dữ liệu (sau ô không trống đầu tiên) được giữ nguyên bất kể. Nhưng IFS trống sẽ bảo tồn không gian hàng đầu (trong ksh và bash). –

+15

Đây là nơi bạn có thể viết 'trong khi IFS = đọc dữ liệu; ... ' –

+0

@glennjackman Tôi đã bắt đầu thử' xuất IFS' ..., tốt tôi đọc bạn tip! –

1

read data sẽ chia dữ liệu theo IFS, thường là "\ t \ n". Điều này sẽ giữ gìn những khoảng trống dành cho bạn:

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

Ngoài ra, sử dụng công cụ phân tích cú pháp tệp tốt, như awk

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

Chỉ để bổ sung cho hồ sơ của DigitalRoss ponse. Đối với trường hợp đó bạn muốn thay đổi IFS chỉ cho lệnh này, bạn có thể sử dụng dấu ngoặc nhọn. Nếu bạn làm như vậy, giá trị của IFS sẽ chỉ được thay đổi bên trong khối. Như thế này:

(số lượng có giữ)
echo ' 
    word1 
    word2' | { IFS='' ; while read line ; do echo "$line" check ; done ; } 

Kết quả sẽ được:

word1 check 
    word2 check 
+0

Mặc dù chưa đặt 'IFS' đã cứu vãn ví dụ cụ thể này, bạn vẫn nên báo giá' "$ line" '. Trong một ví dụ thế giới thực, giá trị vẫn có thể chứa các ký tự đại diện shell và những gì không. – tripleee

8

Trên thực tế, nếu bạn không cung cấp một cuộc tranh cãi với "đọc" cuộc gọi, đọc sẽ thiết lập một biến mặc định được gọi là $ REPLY sẽ giữ khoảng trắng. Vì vậy, bạn chỉ có thể thực hiện việc này:

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

Điều này rất hữu ích. Không biết tại sao bạn có một downvote. Có lẽ nó không phải là đáng tin cậy, không biết nếu nó là như nhau trong tất cả các nền tảng. Đôi khi rất tốt khi biết lý do tại sao một người nhận được tiền thưởng. – 244an

+0

Câu trả lời này đã nhắc tôi đọc kỹ tài liệu cho 'read'. –

+0

Điều này không bảo toàn * khoảng trắng * hàng đầu mà OP đang tìm kiếm –

Các vấn đề liên quan