问题描述
我要获取sitemap.xml
文件,并用新的时间戳替换lastmod
。
sitemap.xml的示例:
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<lastmod>2020-08-02T07:30:53+00:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<lastmod>2020-08-02T07:30:53+00:00</lastmod>
<priority>0.80</priority>
</url>
</urlset>
我的代码:
field=lastmod
timestamp="$(date --iso-8601=seconds)"
sitemap=""
IFS=$'\r\n'
for line in $(cat ./sitemap.xml)
do
case $line in
*"<$field>"*"</$field>"* )
pre=${line#*"<$field>"}
suf=${line%"</$field>"*}
line="${line%$pre}${timestamp}${line#$suf}"
;;
esac
sitemap=$sitemap$line$'\n'
done
# echo $sitemap > sitemap.xml
echo $sitemap
上面的代码应读取文件,替换所需的标签并输出它们。在这里,我试图连接文件字符串以供以后保存。另外,我正在尝试将\n
添加到每一行。
<?xml version="1.0" encoding="UTF-8"?> <url> <lastmod>2020-08-22T15:35:47+03:00</lastmod> <priority>1.00</priority> </url> <url> <lastmod>2020-08-22T15:35:47+03:00</lastmod> <priority>0.80</priority> </url> </urlset>
我在做什么错了?
解决方法
我没有看“你在做什么错”,但这是另一种选择(你只需要调整date
的格式)即可。
$ xmlstarlet ed -u //lastmod -v "`date`" sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<lastmod>Sat Aug 22 14:51:59 CEST 2020</lastmod>
<priority>1.00</priority>
</url>
<url>
<lastmod>Sat Aug 22 14:51:59 CEST 2020</lastmod>
<priority>0.80</priority>
</url>
</urlset>
像这样:
$ xmlstarlet ed -u //lastmod -v "$(date --iso-8601=seconds)" sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<lastmod>2020-08-22T14:53:46+02:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<lastmod>2020-08-22T14:53:46+02:00</lastmod>
<priority>0.80</priority>
</url>
</urlset>
,
将echo $sitemap
替换为echo "$sitemap"
使用引号保留或追加换行符
Shell引用和扩展规则可能很棘手。您需要引用对 sitemap 的作业。例如:
sitemap="$sitemap$line"
您还可能需要引用您的论点以回显。如果您确实想在串联字符串的末尾添加换行符,则必须在引号之外执行扩展,或者将-e
标志与echo一起使用,或者仅执行另一个echo。您也可以使用printf。例如:
-
echo "${sitemap}${line}"$'\n'
-
echo -e "${sitemap}${line}\n"
-
printf "%s%s\n" "$sitemap" "$line"
如果您在其他地方需要换行符,则可以将其移动,但是原理仍然相同。