2012-01-01 3 views
7

Trong bash trên Mac OSX, tôi có một tập tin (test) có chứa các đườngtrong bash, "cho; làm echo; thực hiện" dòng chia tại chỗ

x xx xxx 
xxx xx x 

Nhưng khi tôi thực hiện lệnh

for i in `cat r.txt`; do echo "$i"; done 

kết quả không phải là

x xx xxx 
xxx xx x 

như tôi muốn mà là

x 
xx 
xxx 
xxx 
xx 
x 

Làm cách nào để tạo tiếng vang cho tôi 'x xx xxx'?

+0

awk 'gsub (/ /, "\ n") {print} ' hoặc sed' s// \ n/g ' – kenny

Trả lời

16

Theo mặc định, một vòng lặp Bash cho chia tách trên tất cả khoảng trắng. Bạn có thể ghi đè lên rằng bằng cách thiết lập IFS biến:

IFS=$'\n' 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+0

có lẽ điểm OP hướng tới sử dụng 'trong khi đọc; làm ...; đã thực hiện

+0

@Fredrik: Có lẽ, mặc dù chạy mỗi lần lặp trong một vỏ con riêng biệt ... –

+0

hoàn hảo. cảm ơn bạn. Tôi đã xem xét phương pháp 'trong khi' nhưng tôi có những vấn đề khác với nó dường như khó khăn hơn nhiều để vượt qua vấn đề này. – atheaos

-1
IFS="\n" 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+1

Không hoạt động ... –

+0

@OliCharlesworth tình cờ, khi tôi đang thử nghiệm câu trả lời của bạn, tôi vô tình để lại $ và gõ chính xác những gì Arenielle có ở đây. Nó đã làm việc. Mặc dù bây giờ khi tôi chạy nó trên dữ liệu liên quan nhiều hơn tôi thấy rằng có những tác dụng phụ khác rõ ràng. – atheaos

+0

@atheaos: Bạn có chắc chắn không? '" \ n "' trong Bash không giống như trong C. Hãy thử thay đổi câu lệnh 'echo' của bạn thành ví dụ. 'echo 'LINE: $ i" 'để xem điều gì đang thực sự xảy ra. –

3

Hoặc thiết IFS như đề xuất hoặc sử dụng while:

while read theline; do echo "$theline"; done <thefile 
+0

Cần phải chỉ ra rằng điều này chạy mỗi lần lặp trong một vỏ con riêng biệt ... –

+0

Có, thực sự. Đã chỉnh sửa. – fge

+0

Nó không phải là hiệu quả tôi đã suy nghĩ về. Thay vào đó, tôi đã suy nghĩ về vấn đề phạm vi biến (biến không được chia sẻ giữa "bên trong" và "bên ngoài" vòng lặp). –