정규식을 sed의 하위 집합으로 바꾸기

정규식을 sed의 하위 집합으로 바꾸기

다음과 같은 일부 데이터를 고려하십시오.

"2019-12-12 00:00:01","2012-01-01 01:01:01"

유효한 datetime json 값이 되도록 교체하고 싶습니다.

"2019-12-12T00:00:01+01","2012-01-01T01:01:01+01"

다음 sed 명령을 작성해 보았습니다.

sed 's/"([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])"/\1T/g' test.csv > testnew.csv

그러나 이로 인해 다음과 같은 오류가 발생합니다.

sed: -e expression #1, char 99: invalid reference \1 on `s' command's RHS

왜 이런 일이 발생합니까? 정규식 검색의 하위 일치를 참조하는 방법은 무엇입니까?

답변1

@steeldriver가 언급했듯이 다음과 같이 escape()해야 합니다.

sed 's/"\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\) \([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\)"/"\1T\2+01"/g' test.csv > testnew.csv

또는 sed 버전에 따라 -E 또는 -r과 함께 확장 정규식을 사용하세요. 이는 울타리를 만들지 않고도 그룹을 약간 정리할 수 있다는 장점도 있습니다.

sed -E 's/"([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})"/"\1T\2+01"/g' test.csv > testnew.csv

원하는 출력을 생성하는 데 필요한 것으로 보이므로 두 가지 대체 항목에 "\2+01"을 추가했습니다. 내가 오해했다면 바꾸고 싶을 수도 있겠네요

관련 정보