2017-12-10 11 views
0

私は一時ファイルに1節で、入力ファイル内のセクション1を交換したいsedコマンド:テキストファイルにセクションを置き換える(bashの)

inputfileはここ

section1 
a1 
section2 
a2 
section3 
a1 

temporaryfileのcontenstある含まれています

section1 
a1,b2 

私の現在の試みは、次のようになります。

sed -i "/$section/,//{/$section/{p;r $temporaryfile};//p;d}" $Inputfile 

私は次の出力を参照したいと思います。しかし、私のコードは、単に私にエラーメッセージを表示します

section1 
a1,b2 
section2 
a2 
section3 
a1 

を:

sed: -e expression #1, char 0: unmatched `{' 
sed: -e expression #1, char 0: unmatched `{' 

は、sedのhttps://superuser.com/questions/440013/how-to-replace-part-of-a-text-file-between-markers-with-another-text-file

答えて

1

は、S /古いためであると呼ば/新しい、それはすべてです。 ...ただ単純さ、堅牢性、移植性、効率性などのためのawkを使用し、何のために:sed

$ cat tst.awk 
NR%2 { name = $0; next } 
NR==FNR { val[name] = $0; next } 
{ print name ORS (name in val? val[name] : $0) } 

$ awk -f tst.awk temporaryfile Inputfile 
section1 
a1,b2 
section2 
a2 
section3 
a1 
1

多くの方言は、「コマンド」は、個々のように中括弧が必要です。したがって、最後の閉じ括弧の前にセミコロンが必要です。

また、rの後の引数にはクォートがないため、明示的に終了する必要があります。改行で

最後に、マイナーな最適化として、no-opの空の正規表現//は目的を果たしません。あなたはそれを放置することができます。

sed "/$section/,//{/$section/{p;r $temporaryfile 
};p;d;}" 

シェルの初心者の中には、引用符内に改行を入れることができますが、実際は完全に正常です。

関連する問題