在正则表达式之间替换字符串

时间:2016-08-10 13:59:42

标签: regex bash sed character-replacement

我有一个csv文件,其中包含以下内容:

INTERB-MNT,2008-09-10T21:05:38Z,2008-09-10T21:05:38Z,MARIA

如何使用sed替换字符'T''Z',以便将文件内容更改为以下内容?:

INTERB-MNT,2008-09-10,21:05:38,UTC,2008-09-10,21:05:38,UTC,MARIA

我尝试了以下内容,但很明显我错过了一些东西,因为这不会产生预期的结果:

sed -e 's/[0-9]{4}-[0-9]{2}-[0-9]{2}.T.[0-9]{2}:[0-9]{2}:[0-9]{2}Z/[0-9]{4}-[0-9]{2}-[0-9]{2},[0-9]{2}:[0-9]{2}:[0-9]{2}UTC/g'

1 个答案:

答案 0 :(得分:0)

要在替换后保留文本,您必须使用parens捕获输入,然后使用\1\9来引用替换部分中捕获的匹配。为了能够使用\1\9反向引用,您必须使用-E-r选项。

命令如下所示:

sed -r 's/(.+)T(.+)Z/\1,\2,UTC/g'

但是无法使用:T将匹配字符串的最后一部分,因为(.+)是贪婪的。因此,匹配2008-09-1021:05:38模式的想法很好。你最终得到了这个:

sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2})T([0-9]{2}:[0-9]{2}:[0-9]{2})Z/\1,\2,UTC/g'

这很有效。您也可以使用这个更简单的命令:

sed -r 's/(....-..-..)T(..:..:..)Z/\1,\2,UTC/g'

读写更容易,误报的可能性很小。这取决于你的需求。