forループの結果をhtmlファイルに挿入する - BASH

forループの結果をhtmlファイルに挿入する - BASH

コマンドの結果を取得してHTMLコードに保存するスクリプトがあります。

私が今まで持っているのは次のとおりです...

#!/bin/bash

list_dir=`ls -t downloads/`

for i in $list_dir
do
#----  
#       echo "<a href=\"downloads/$i\">$i</a>"
#----attempt 1   
#    
  ` sed -n 'H;${x;s/placeholder .*\n/<a href="downloads/$i">$i</a>\
                       &/;p;}' index.html`
done

「プレースホルダ」とマークされたhtmlファイルの内容を置き換えるためにforループの結果を取得しようとしています。プレースホルダーなしで特定のポイントの下にコンテンツを挿入するだけです。私は何をすべきかわからない。

答え1

パラメータ置換を使用すると、エスケープを問題なくテキストを置き換えることができます。

output=$(ls -t downloads | while IFS= read -r f; do
    echo "<a href=\"downloads/$f\">$f</a>"
done)

html=$(<index.html)
html=${html/placeholder/$output}
echo "$html" > output.html

awk -v以下を使用して代替テキストを変数として渡すこともできます。

awk -v v="$output" '{sub("placeholder",v);print}' index.html > output.html

または、プレースホルダーなしで複数行のパターンを置き換えるには、Rubyを使用してください。

echo "$output" | ruby -i -e 'print gets(nil).sub(/<a .*<\/a>\n/m, STDIN.read)' index.html

答え2

どういうわけか途中で出力を挿入するのではなく、ファイルの内容全体を置き換えようとすると、sed#1はループ全体の出力をリダイレクトする場合に基づいた方法よりも望むものに近づくことがあります。

#!/bin/bash

list_dir=`ls -t downloads/`

for i in $list_dir
do
    echo "<a href=\"downloads/$i\">$i</a>"
done > index.html

答え3

一重引用符内の変数が拡張されないsedなど、lineにはいくつかの問題があります。$i

次のindex.htmlが与えられた場合:

<html>
<body>
<!-- placeholder -->
</body>
</html>

sed中間ファイルを入力/出力として使用してみてください。

#!/bin/bash

list_dir=`ls -t downloads/`

cp index.html out.html

for i in $list_dir
do
   sed "s/<!-- placeholder -->/<a href='downloads\/$i'>$i<\/a>\n<!-- placeholde
r -->/" out.html > tmp.html
   mv tmp.html out.html
done
cat out.html

もちろん、ファイル名にスペースが含まれていると問題が発生しますが、これは別の問題です。

関連情報