2010-03-17 44 views
2

我的輸入文件的內容是貓新線

歡迎

welcome1

使用welcome2

我的劇本是

for groupline in `cat file` 
do 
     echo $groupline; 
done 

我得到了以下Ø本安輸出。

 
welcome 
welcome1 
welcome2 

爲什麼它不打印空行。我想要理由。

回答

4

需要設置IFS爲換行符\n

IFS=$"\n" 
for groupline in $(cat file) 
do 
     echo "$groupline"; 
done 

或者把雙引號。見here用於解釋

for groupline in "$(cat file)" 
do 
     echo "$groupline"; 
done 

沒有與IFS多管閒事,「正確」的方法是使用而讀循環

while read -r line 
do 
echo "$line" 
done <"file" 
+0

雙引號+1。它爲我做了正確的迴應換行符的訣竅! – 2012-08-22 14:37:05

1

因爲你所做的一切都是錯誤的。你想whilefor,你想read,不cat

while read groupline 
do 
    echo "$groupline" 
done < file 
+1

是啊,這事我知道的字符。但我想知道爲什麼貓命令不給循環的實際東西。 – muruga 2010-03-17 07:06:43

+2

'for'不關心「行」。它只關心「單詞」,'$ IFS'中的任何內容都用於分隔單詞。默認情況下它包含'「\ t \ n」',這意味着換行符被忽略。 – 2010-03-17 07:08:51

+0

我接受您的評論。不適用於代碼。因爲我只需要代碼。 – muruga 2010-03-17 07:16:41

0

The solution ghostdog74 provided是有益的,但有一個缺陷。

IFS不能使用雙引號(至少在Mac OS X),但可以使用單引號,如:

IFS=$'\n' 

這是不錯的,但不是衝兼容的,這也許是更好的:

IFS=' 
' 

的空行將會在下面的程序可以吃

IFS=' 
' 
for line in $(cat file) 
do 
     echo "$line" 
done 

但你不能醃肉加雙引號nd $(cat file),它會將整個文件視爲一個單獨的字符串。

for line in "$(cat file)" 

如果要空一行也被處理,使用以下

while read line 
do 
    echo "$line" 
done < file 
0

使用IFS=$"\n"var=$(cat text.txt)刪除所有「N」從輸出echo $var