次のようないくつかのデータを考えてみましょう。
"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つの代替項目に「\ 2 + 01」を追加しました。誤解したら変えたいかもしれませんね