2017-03-06 38 views
-1

私は2つのファイルを持っています。そのうちの1つは、NAMEという単語が入っているレターファイルで、もう1つのファイルの内容と置き換えたいと思っています。もう一方のファイルには名前のリストが含まれています。ファイル内の文字列を他のファイルの文字列に置き換えます。他のファイルの文字列に1回置き換えます。

例えば、文字ファイルは

Thanks NAME, bye NAME 

とファイル名の名前のリストである

Mark 
Micheal 
Jon 
... 

であり、私は私がしたい、変更せずに、元の文字ファイルが欲しいです例えば、letter1はThanks Mark, bye Markletter2 Thanks Micheal, bye Michealのように、元の文字のコピーを生成します。

Linuxのシェルスクリプトを使ってどうすればいいですか? これは

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

現在のところ、これは

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

(少し遅いかもしれないが、それは動作します)あなたが望むもののただの要件。より良い質問は、a)より具体的なもの(例えば、出力がそれぞれ別のファイルに移動するかどうか)と、b)自分の努力と失敗した場所を示すことです。 –

+0

また、おそらく "Michael"です。 –

+0

はい、元の文字ファイルを変更したいのですが、元の文字のコピーを生成したいのです。たとえば、「Thanks Mark、bye Mark」とletter2「Thanks Micheal、bye Micheal」が入っています。 – snow

答えて

0

ファイル名に加えて名前を使用することをお勧めします。

ループでは、各名前を変数に読み込み、置換に使用します。

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

これはより、letter.Michael.txt a.s.o.をletter.Mark.txtという名前のファイルを作成します。

あなたは$iで知られている数に応じてファイルを持っている必要があります場合は、あなたのループ内で変数を割り当てる:

+0

ありがとう!それは私が第2の解決策をforループの中に入れた場合には、 – snow

+0

の仕事です。 wc -l'は動作しませんでした。どのように私はそれを動作させる? – snow

+0

'$(cat names | wc -l)'しかし、私はそれをお勧めしません。代わりに最初の解とカウンタ 'i = $((i + 1))'を使用してください。 –

関連する問題