2016-11-14 11 views
1

基本的には「テンプレート」ファイルを持っています基本的には他の補助ファイルの内容数字と手紙の私は他の代用を行いますが、これは問題を起こすものです。配列に格納されている別のファイルの内容を変数とするbash置換のSED

テンプレートファイルでは、補助ファイルで置き換えたい場所に "%label"を配置しました。

for i in $(cat file_list.txt); do 
    array[$i]=$(<file_$i.txt) 
done 

for i in $(cat file_list.txt); do 
    sed -e "s/%label/${array[$i]}/g"<template.txt> final_file_$i.txt 
done 

(「file_listのは、」ファイルが含まの名前を)しかし、私はsedのエラー「受信し続ける:-e式#3、CHAR 58:終端されていない `s'はその後、私は、置換を行うには、このスクリプトを使用して、コマンドを"私もそれを行うためのスクリプトのこの種を試してみた

for i in $(cat file_list.txt); do 
    mapfile < file_$i.txt 
    array[$i]=${MAPFILE[@]} 
done 

for i in $(cat file_list.txt); do 
    sed -e "s/%label/${array[$i]}/g"<template.txt> final_file_$i.txt 
done 

この場合、私は、エラーの警告を受信しないと置換が行われますが、改行なし。

改行を維持して代用する方法はありますか?

ありがとうございます。

+0

根本的な問題は、どのような '$ {配列[$ iは]}'シェルによって展開されますする場合は、ファイル名であることを意味 'sed'構文、対象となるということです'file_list.txt'はスラッシュを含むパスです(あなたの' sed'-expressionで区切り文字として使用したものですから)。あるいは 'sed'の視点からの他の特殊文字が置換に失敗します。 –

+0

お返事ありがとうございます、@AdrianFrühwirth。 現在、私のファイル名にバックスラッシュは含まれていません。また、私が "mapfile"を使用したとき、私は何のエラーも出なかった。 sedセパレータをカンマに変更しようとしましたが、同じエラーが発生しています。 –

答えて

1

は、置換文字列に改行文字が現れ、s///をバックスラッシュでエスケープする必要があるという問題があります。この質問で報告されたエラーは、置換文字列を含むファイルの改行に起因しています。

s///コマンドのパターンまたは置換文字列で変数を使用することは、通常はお勧めできません。

あなたはBashを使用しているので、sed、または他の外部コマンドを使用する必要はありません。この純粋なbashのコードは試してみてください。

template=$(< template.txt) 
for id in $(< file_list.txt) ; do 
    contents=$(< "file_$id.txt") 
    final_contents=${template//%label/"$contents"} 
    printf '%s\n' "$final_contents" > "final_file_$id.txt" 
done 
関連する問題