使用 sed 中的子集替换正则表达式

使用 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

为什么会发生这种情况?如何引用正则表达式搜索的子匹配?

答案1

正如 @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”添加到两者的替换中,因为这似乎是生成所需输出所需的内容。如果我误解了你可能想要改变它

相关内容