コマンドの結果を取得して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
もちろん、ファイル名にスペースが含まれていると問題が発生しますが、これは別の問題です。