将 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

我试图获取 for 循环的结果来替换 html 文件中显示“占位符”的内容(我宁愿让它只将内容插入某个点下方,而无需占位符)。我不太确定该怎么做。

答案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,例如单引号中的变量$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

当然,当文件名中包含空格时,您会遇到问题,但这是另一个问题。

相关内容