2016-04-24 60 views
3

我試圖與包含名爲itemlist.txt的文本文件的工作:如何使用多個循環並將輸出存儲到多個變量?

http://example.com/item-a 
http://example.com/item-b 
http://example.com/item-c 
http://example.com/item-d 
http://example.com/item-e 

我試過的代碼許多不同的變化。有些會返回只是項目,但不是網址。我無法弄清楚如何正確分配$url。這是最接近我達到預期的輸出。

#!/bin/bash 

while read url; do 
for item in $(sed "s/http:\/\/example.com\///g"); do 
echo $item $url; done 
done < itemlist.txt 

所需的輸出是:

item-a http://example.com/item-a 
item-b http://example.com/item-b 
item-c http://example.com/item-c 
item-d http://example.com/item-d 
item-e http://example.com/item-e 

但不是我越來越:

item-b http://example.com/item-a 
item-c http://example.com/item-a 
item-d http://example.com/item-a 
item-e http://example.com/item-a 

有人可以闡明如何正確地做到這一點一些輕?

回答

7

請勿使用sed;只需使用參數擴展即可刪除網址中包括最終/在內的所有內容。

while IFS= read -r url; do 
    item=${url##*/} 
    echo "$item $url" 
done < itemlist.txt 

(你的問題,順便說一句,是既sedreaditemlist.txt閱讀; read得到第一線,和sed消耗剩下的第一次迭代後,您while循環退出)

+1

++爲解釋;總的來說,我仍然建議通過shell循環來調用一個工具。 – mklement0

+1

關於第二個想法:標題表明_storing結果在shell變量_中可能是一個要求,儘管目前尚不清楚這是否僅僅意味着結束打印結果;無論如何:如果您需要將每行結果存儲在_shell variables_中,請使用_this_答案;考慮awk解決方案,如果它只是stdout輸出很重要。 – mklement0

+1

同意; shell具有一些基本的數據處理能力,但通常它只能用於支持shell的主要存在理由,即執行其他程序。數據處理本身應該用更合適的語言來完成,比如'awk'。 – chepner

3

這個答案假設打印結果爲stdout就足夠了;相反,如果需要爲每個輸入行存儲shell變量的結果組件,請參見chepner's helpful answer

awk可能是在這裏使用的最佳工具:

awk -F/ '{ print $NF, $0 }' itemlist.txt 
  • -F/分裂由/
  • $NF每個輸入行到字段是每個輸入行的最後
  • $0是完整的輸入行。
  • print默認打印其參數由一個單獨的空格分隔(基於內置變量OFS;設置OFS更改)。
2

那麼,awk可能是mklement0's answer中顯示的最佳工具。但是,選擇另一個選項沒有任何壞處。

如果您的sed沒有-r選項,只是逃離所有parens。我用#作爲分隔符。您可以通過轉義作爲捕獲組一部分的/來使用常規掩碼。

邏輯非常簡單。你貪婪地捕獲所有東西,直到捕獲組中的最後一塊。您捕獲另一個捕獲組中的最後一塊,並使用它們來滿足您所需的輸出。

$ sed -r 's#(.*/)(.*)$#\2 \1\2#' file 
item-a http://example.com/item-a 
item-b http://example.com/item-b 
item-c http://example.com/item-c 
item-d http://example.com/item-d 
item-e http://example.com/item-e 
+0

++;如果你使用'-E'而不是'-r',它也可以在OS X上工作('-E'沒有記錄在_GNU_'sed'的'man'頁面中,但它確實可以作爲別名'-r')。 – mklement0

+1

有點生疏,經常不回答。 ')' –

相關問題