2012-01-01 22 views
7

在Mac OSX上的bash分割線,我有一個包含該行的文件(測試案例)在bash,「爲;做回聲;完成」的空間

x xx xxx 
xxx xx x 

但是,當我執行命令

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

結果不

x xx xxx 
xxx xx x 

,因爲我想,而是

x 
xx 
xxx 
xxx 
xx 
x 

我該如何讓echo給我'x xx xxx'?

+0

AWK「GSUB(/ /, 「\ n」 個){打印} ' 或 sed's// \ n/g' – kenny 2012-01-01 18:41:21

回答

16

默認情況下,Bash for循環會在所有空白處分裂。所建議

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

也許指向OP使用'while read;做...;而不是。 – 2012-01-01 18:43:47

+0

@Fredrik:也許,雖然這在每個迭代中運行一個單獨的子shell ... – 2012-01-01 18:45:12

+0

完美。謝謝。我曾看過'while'方法,但我還遇到過其他問題,看起來比這個回聲問題更難克服。 – atheaos 2012-01-01 18:45:27

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

不起作用... – 2012-01-01 18:42:22

+0

@OliCharlesworth偶然地,當我測試你的答案時,我不小心漏掉了$並輸入了Arenielle在這裏的內容。有效。 雖然現在當我運行它涉及更多的數據時,我發現顯然還有其他副作用。 – atheaos 2012-01-01 18:51:56

+0

@atheaos:你確定嗎? ''\ n「'在Bash中與C中的不同。嘗試將'echo'語句改爲例如'echo「LINE:$ i」'看看究竟發生了什麼。 – 2012-01-01 18:57:27

3

要麼設置IFS,或使用while::可以通過設置IFS變量重寫

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

應該指出的是,這將在一個單獨的子shell中運行每個迭代... – 2012-01-01 18:46:12

+0

是的,確實如此。編輯。 – fge 2012-01-01 18:48:30

+0

這不是我想到的效率。相反,我在考慮變量作用域的問題(變量不在循環的「內部」和「外部」之間共享)。 – 2012-01-01 18:50:18