次のようなデータについて考えてみます。
"2019-12-12 00:00:01","2012-01-01 01:01:01"
有効な日時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
なぜこれが発生するのですか?また、正規表現検索の部分一致を参照するにはどうすればよいですか?
@steeldriverが述べたように、次のように()をエスケープする必要があります。
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」を追加しました。これは、目的の出力を作成するために必要なもののようです。私が誤解した場合、あなたはおそらくそれを変更したいと思うでしょう