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 が \\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>

関連情報