我有一个脚本,它获取命令的结果并将它们放入 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
当然,当文件名中包含空格时,您会遇到问题,但这是另一个问题。