2010-04-21 61 views
0

我所試圖做的是運行的sed在目錄Server_Upload多個文件,使用變量:SED,使用變量和一個數組

AB${count} 

對應,一些變量我做的,看起來像:

echo " AB1 = 2010-10-09Three " 
    echo " AB2 = 2009-3-09Foo " 
    echo " AB3 = Bar " 

而且這些對應於包含master.ta一個字每行,需要在Server_Upload的所有文本文件的變化。

如果你明白我的意思......很好,我試着盡我所能解釋它,但是如果你仍然不滿,我會再給它一次,因爲我發現它很難傳達我的意思。

cd Server_Upload 
for fl in *.UP; do 
    mv $fl $fl.old 
    done 

count=1 
saveIFS="$IFS" 
IFS=$'\n' 
array=($(<master.ta)) 
IFS="$saveIFS" 
for i in "${array[@]}" 
do 
    sed "s/$i/AB${count}/g" $fl.old > $fl 
    ((count++)) 
done 

它運行,不給我任何錯誤,但它沒有做我想要的東西,所以有什麼想法?

+2

下次顯示您獲得的文件樣本。以及你想要的輸出是什麼樣子。沒有解釋你想要使用什麼樣的樣本,即使你發佈了你的代碼,因爲你的代碼可能是錯誤的,所以很難說你實際上在做什麼。 – ghostdog74 2010-04-21 23:56:37

回答

2

你的循環應該是這樣的:

while read i 
    do 
    sed "s/$i/AB${count}/g" $fl.old > $fl 
    ((count ++)) 
done < master.ta 

我沒有看到一個理由使用數組或類似的東西。這對你有用嗎?

0

它看起來像你的sed命令取決於$fl從第一for循環內,即使sed線是for循環之外。如果你是一個系統,sed確實就地編輯(在-i選項),你可以做:

count=1 
while read i 
    do 
    sed -i'.old' -e "s/$i/AB${count}/g" Server_Upload/*.UP 
    ((count ++)) 
done < master.ta 

(這是整個腳本,它採用了帕特里克的答案,也是如此。)這個應該取代對於任何* .UP文件中nmaster.ta的每一次出現的文字ABn

0

這不完全清楚,我是你正在嘗試做的,但我相信你想要的東西,如: (未經測試)

 
do 
eval repl=\$AB${count} 
... 

如果你有一個變量$ AB3和變量$ count, $ AB $ {count}是$ AB和$ count的連接(所以如果$ AB是空的,它與$ count相同)。您需要使用eval來獲取$ AB3的值。

0

如果您將第一個done聲明從第二個done之後移到第二個聲明,它會有幫助嗎?