2011-09-07 34 views
13

Khi tôi sử dụng "mèo test.file", nó sẽ hiển thịLàm thế nào để giữ dấu gạch chéo ngược khi đọc từ một tệp?

printf "This is a test log %d \n, testid"; 
1 
    2 

Khi tôi sử dụng file bash,

IFS="" 
while read data 
do 
    echo "$data" 
done << test.file 

Nó sẽ hiển thị

printf "This is a test log %d n, testid"; 
1 
    2 

Các "\" đã biến mất.

Có cách nào để tôi có thể giữ "\" và không gian cùng một lúc không?

+2

Tôi nghĩ bạn có nghĩa là '

+1

'bash' thông tin, tìm kiếm các "đọc" commmand : "Ký tự dấu chéo ngược '\' có thể được sử dụng để loại bỏ bất kỳ ý nghĩa đặc biệt nào cho ký tự tiếp theo được đọc và để tiếp tục dòng." (Điều này không giải quyết được vấn đề, nhưng nó giải thích nó.) –

Trả lời

24

Thử sử dụng read -r.

Từ trang người đàn ông:

-r
Nếu tùy chọn này được đưa ra, xuyệc ngược không đóng vai trò như một lối thoát nhân vật. Dấu gạch chéo ngược được coi là một phần của dòng. Cụ thể, một dấu gạch chéo ngược-dòng mới có thể không được sử dụng làm tiếp tục dòng.

Execute này để kiểm tra nó:

read -r a < <(echo "test \n test"); echo $a 
0
data="$(cat < test.file)" 
for line in $data 
do 
echo "$line" 
done 
+2

Đơn giản: 'data =" $ (cat test.file) "' hoặc 'data =" $ (

+2

Bạn không cần phải slurp toàn bộ tập tin vào '$ data'. 'cho dòng trong $ (

+0

Bạn vẫn sẽ cần phải chơi với IFS để ngăn chặn bash giải thích chúng như là dấu phân tách. – jedwards

0
#!/bin/bash 

# Store the original IFS 
OIFS="$IFS" 
# Update the IFS to only include newline 
IFS=$'\n' 
# Do what you gotta do... 
for line in $(<test.file) ; do 
    echo "$line" 
done 
# Reset IFS 
IFS="$OIFS" 

Khá nhiều nơi bạn đang đứng đầu với IFS cộng gợi ý Keith Thompson.

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