web-dev-qa-db-ja.com

正規表現で置き換えるためにsedでサブセットを使用する

次のようなデータについて考えてみます。

"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

なぜこれが発生するのですか?また、正規表現検索の部分一致を参照するにはどうすればよいですか?

2
paul23

@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」を追加しました。これは、目的の出力を作成するために必要なもののようです。私が誤解した場合、あなたはおそらくそれを変更したいと思うでしょう

0
Amos