2016-05-03 9 views
1

私はbashのスクリプティングに全く新しいので、すみません... 標準の見出しを含むテンプレートにいくつかのHTMLコンテンツを結合しようとしています。私がちょうど見つけて置き換えることができると思った "交換"。このループは、ディレクトリ内のすべてのファイルに対して操作を繰り返すだけです。Bashの文字列操作が望ましくない新しい行の文字を削除する

REPLACEME="REPLACEME" 
for file in *.html 
do 
TEMPLATE=$(<../template/template.html) 
CONTENT=$(<$file) 
OUTPUT="${TEMPLATE/"$REPLACEME"/"$CONTENT"}" 
echo $OUTPUT > ../compiled/$file 
done 

これは動作しますが、結果のHTMLファイルに改行文字が取り除かれているため、ジャンクのように見えます。誰も助けることができますか?

+0

で上記を達成することができます。特に: 'perl -pi -e 's/search/replace/g' * .html' – Wolph

答えて

3

は置換:と

echo $OUTPUT > ../compiled/$file 

echo "$OUTPUT" > ../compiled/$file 

をシェルは引用符で囲まれていない変数にを分割ワードを行います。 IFSのデフォルト値では、これは、タブと改行を含むすべての空白シーケンスが1つの空白で置き換えられることを意味します。これを防ぐには、上記のように変数を二重引用符で囲みます。 sedを使用して

+1

しかし、' echo'自体が改行を追加します.. – heemayl

+0

@heemaylはい、それは本当です。最後に多くの改行があったので、 'echo -n'(bash)や' printf'(POSIX)を使うことができました。しかし、コード 'TEMPLATE = $(<../ template/template.html)'は、入力から最後の改行を削除します。したがって、ここでは最終改行がなくなり、 'echo'がそれを返すのは良いことです。 – John1024

3

あなたは以下のようにそれを達成することができます:sedの中

sed -i 's/REPLACEME/new_text/g' /path/to/your/template.html 

-iオプションは、インプレース編集のためにある& gオプションは、グローバル置換のためです。

編集1:

あなたはsed内の変数を使用する必要がある場合は、このようにそれを行うことができます

var="Sometext"; 
sed -i "s/REPLACEME/$var/g" /path/to/your/template.html 

マインドここでは二重引用符は、シェル変数を展開することができます。


お使いのシステムは、GNU-AWKをサポートしている場合(gawk)あなたはおそらく、簡単に解決策は、Perlのパイです

gawk ' 
{ 
$0=gensub(/REPLACEME/"NEWTEXT","g",$0) 
printf "%s\n", $0 
}' </path/to/your/template.html> newtemplate.html && mv newtemplate.html template.html 
+0

私はsedを試みましたが、 "new_text"がある変数を受け入れることができませんでした。それは常にREPLACEMEを変数名に置き換えましたか?私はそれを動作させる方法を知りたいです! – Jimnotgym

+0

@ジムノジム(Jimnotgym):編集をご覧ください。 – sjsam

関連する問題