2012-02-25 97 views
0

我從for循環讀取文件中的每一行,並在每行之後讀取每個單詞,從而得到一些奇怪的行爲。閱讀每行跳過最後一個字。我想我可能必須指定空格和換行符都是分隔符,但我還沒有發現如何做到這一點。這裏是腳本的重要部分:「閱讀」每行跳過最後一個字

cat $i | while read line  
    do 
     echo $line 
     sleep 1 
     #Process each word 
     echo $line | while read -d ' ' word 
     do 
      echo $word 
      sleep 1 
     done 
    done 
+0

避免不必要的'cat's:'while read line;做...;完成<$ i' – knittl 2012-02-25 18:38:55

回答

2

你看到How to split one string into multiple strings separated by at least one space in bash shell??也許你可以只是做:

for word in $line 
do 
    echo $word 
    sleep 1 
done 
+0

這似乎像一個魅力工作,猜測我太使用閱讀,因爲我用它來讀取文件掛了。 – Asgeir 2012-02-25 18:36:27

+0

不確定,但我認爲這將使$ line符合通常的shell擴展,這可能會比你想要的更多。您將需要試驗輸入行中包含雙引號和單引號和反引號(平衡和不平衡)和美元符號('$')的情況。如果這對你來說是一個問題,你可以考慮基於'fmt'的解決方案,我在下面建議。 – 2012-02-25 19:00:16

2

for命令的語法是:

 for name [ [in [words ...] ] ; ] do commands; done 

展開的話,並在結果列表中的每個成員執行一次命令,以及綁定到當前成員名稱。

cat $i | while read line  
do 
    echo $line 
    sleep 1 
    #Process each word 
    for word in $line 
    do 
     echo $word 
     sleep 1 
    done 
done 
+0

這似乎像一個魅力工作,猜測我太被掛上使用閱讀,因爲我用它來讀取文件 – Asgeir 2012-02-25 18:36:56

0

嘗試使用剪切命令,而不是讀-d

0

如果你不需要記住線的分界線,fmt命令可以非常有用。 fmt將stdin上的純文本重排爲給定的最大行長度,因此,如果將其最大行長度設爲1,則最終會將輸入的每個單詞分割到其自己的行中。對於你的問題,也許

cat $1 | 
fmt -1 | 
while read word 
do 
    # do something with $word 
end 

請注意,您在這裏失去了原來的邊界線,而你依賴的一個詞是什麼fmt的定義。如果你真的需要線路邊界出於某種原因,你可以考慮類似

cat $1 | 
while read line 
do 
    # do something with $line 
    echo "$line" | 
    fmt -1 | 
    while read word 
    do 
     # do something with $word 
    done 
done