2017-03-06 79 views
-1

我有兩個文件。其中之一是一個字母文件,其中包含NAME這個詞,我想用另一個文件的內容替換它。另一個文件包含一個名稱列表。用其他文件中的字符串替換文件中的字符串,其他文件中的每個字符串替換一次

例如,字母的文件是

Thanks NAME, bye NAME 

,並在文件名名稱的列表是

Mark 
Micheal 
Jon 
... 

,我想,沒有改變原來的字母的文件,我想生成帶有更改的原始信件的副本,例如letter1包含Thanks Mark, bye Markletter2 Thanks Micheal, bye Micheal等等。

如何使用Linux shell腳本來做到這一點? 這是我的代碼

for ((i=1 ; i<= cat names | wc -l ; i++)) 

do 

sed 's/NAME/names/g' letter.txt > letter1.txt 

done 

cat names | wc -l沒有工作,sed 's/NAME/names/g' letter.txt > letter1.txtnames,而不是文件名的內容替換詞NAME。我也不知道如何創建許多信件文件的副本。

+0

目前,這是隻是你想要什麼的要求。一個更好的問題是a)更具體(例如,如果輸出結果分別轉到不同的文件?)和b)顯示你自己的努力以及你失敗的地方。 –

+0

另外,它可能是「邁克爾」。 –

+0

是的,我想要改變的原始信件文件,我想要生成帶有更改的原始信件的副本,例如letter1包含「謝謝馬克,再見馬克」和letter2「謝謝邁克爾,再見邁克爾」。 – snow

回答

0

我建議你使用名稱作爲文件名的補充。

因此在循環中將每個名稱讀入一個變量,並將其用於替換。

cat names | while read -r name; do 
    sed 's/NAME/'"$name"'/g' letter.txt > letter."$name".txt 
done 

這會比創建一個名爲letter.Mark.txt文件,letter.Michael.txt a.s.o.

如果按照$i已知數量有文件,你的循環內分配變量與:

name="$(cat names|head -n "$i"|tail -n1)" 

(可能會有點慢,但它的工作原理)

+0

非常感謝!這是工作 – snow

+0

如果我把第二個解決方案內的for循環,正如我之前說過的'貓名| wc -l'不起作用。我如何使它工作? – snow

+0

'$(cat names | wc -l)'但我不會推薦使用第一個解決方案和一個計數器'i = $((i + 1))'代替。 –

相關問題