正規表現を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つの代替項目に「\ 2 + 01」を追加しました。誤解したら変えたいかもしれませんね

関連情報