2013-05-28 36 views
15

Tôi muốn đọc một dòng tệp theo dòng trong kịch bản lệnh shell của Unix. Dòng có thể chứa các khoảng trắng đầu và cuối và tôi cũng muốn đọc các khoảng trống đó trong dòng. Tôi đã thử với "trong khi đọc dòng" nhưng đọc lệnh được xoá các ký tự không gian từ dòng :( Ví dụ nếu dòng trong tập tin bao gồm: -Đọc từng dòng tệp (có khoảng trắng) trong tập lệnh Unix Shell - Số phát hành

abcd efghijk 
abcdefg hijk 

dòng cần được đọc như sau: - 1) "abcd efghijk" 2) " abcdefg hijk"

gì tôi cố gắng là thế này (mà không làm việc): -..

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

tôi muốn dòng bao gồm không gian và tab nhân vật trong nó Xin gợi ý một cách

Trả lời

22

Hãy thử điều này,

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

EDIT:

Từ 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

Đã hoạt động! Cảm ơn. Plz giải thích về IFS. –

+0

đã cập nhật bài đăng. – sat

+7

Về mặt tự nhiên, bạn sẽ chỉ định rỗng 'IFS' chỉ cho câu lệnh' read', để tránh các hiệu ứng phụ lạ: 'while IFS = read line' – l0b0

15

Bạn muốn đọc liệu dòng để tránh các vấn đề với backslashes trong đầu vào (sử dụng -r) :

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

Điều này sẽ giữ khoảng trống bên trong dòng, nhưng loại bỏ khoảng trắng đầu và cuối. Để giữ cho những người là tốt, thiết lập IFS trống rỗng, như trong

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

này bây giờ là tương đương cat < file.txt càng lâu càng file.txt kết thúc bằng một dòng mới.

Lưu ý rằng bạn phải tăng gấp đôi báo giá "$line" để ngăn tách từ tách dòng thành các từ riêng biệt - do đó mất nhiều chuỗi khoảng trắng.

+0

Cảm ơn bạn đã mô tả nó. –

+2

@SourabhSaxena Bạn được chào đón. Cách thể hiện "cảm ơn" trên Stackoverflow là để upvote bằng cách nhấp vào mũi tên lên bên trái của một câu trả lời. – Jens

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