重击循环中的字符串连接

问题描述

我要获取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"

如果您在其他地方需要换行符,则可以将其移动,但是原理仍然相同。