sed 使用命令反向引用

sed 使用命令反向引用

我有一根绳子

STR="<trkpt lat="53.4829787887" lon="-113.518349362"><ele>682.0</ele><time>2020-01-09T01:00:01Z</time><speed>20.0</speed></trkpt>"

我试图用时间+1 秒替换时间。

为了实现这一目标,我有:

echo $STR | sed -e 's/<time>\(.*\)<\/time>/<time>'$(TZ=UTC date "+%Y-%m-%dT%H:%M:%SZ" -d "\1 + 1 seconds")'<\/time>/g'

但是我不断收到错误

date: invalid date ‘\\1 + 1 seconds’

为什么 \1 在子 shell $() 下被插值为 \\1?

有人可以帮助我错误的地方并帮助理解这里发生的事情吗?

使用 gnu sed 4.4。

答案1

我会使用适当的 XML 解析器做什么(不要sed用于此任务):

 输入文件

$ cat file.xml
<trkpt lat="53.4829787887" lon="-113.518349362">
  <ele>682.0</ele>
  <time>2020-01-09T01:00:01Z</time>
  <speed>20.0</speed>
</trkpt>

您可以编辑在飞行中xmlstarlet ed -L -u ...

 命令

d=$(xmlstarlet sel -t -v '/trkpt/time/text()' file.xml)
xmlstarlet ed -u '/trkpt/time/text()' -v $(
    TZ=UTC date "+%Y-%m-%dT%H:%M:%SZ" -d "$d + 1 seconds"
) file.xml

 输出

<?xml version="1.0"?>
<trkpt lat="53.4829787887" lon="-113.518349362">
  <ele>682.0</ele>
  <time>2020-01-09T01:00:02Z</time>
  <speed>20.0</speed>
</trkpt>

相关内容