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>

관련 정보