替换时间戳中的短划线

时间:2014-09-12 15:10:14

标签: awk sed

我有一个带有时间戳的文件

   2014-06-04 00:00:06.487,,4324
   2014-06-04 00:00:43.487,,-2321

我想用/(正斜杠)替换时间戳 - (破折号)

所以反之亦然:

   2014/06/04 00:00:06.487,,4324
   2014/06/04 00:00:43.487,,-2321

我想知道是否可以用sed做到这一点,我将如何做到这一点?

3 个答案:

答案 0 :(得分:4)

我愿意:

awk 'gsub(/-/,"/",$1)||7' file

这只会替换第一列中的-,在您的示例中为日期,并保持其他-不变。

示例:

kent$  cat f
2014-06-04 00:00:06.487,,4324
2014-06-04 00:00:43.487,,-2321

kent$  awk 'gsub(/-/,"/",$1)||7' f
2014/06/04 00:00:06.487,,4324
2014/06/04 00:00:43.487,,-2321

如果您的日期字符串也可以是其他列,我们必须通过所有字段,并检查它是否与xxxx-xx-xx匹配,然后进行替换。对于awk来说这也是一件容易的事。如果是这种情况,请告诉我。

答案 1 :(得分:1)

通过GNU sed,

$ sed -r 's~-([0-9]{2}\b)~/\1~g' file
   2014/06/04 00:00:06.487,,4324
   2014/06/04 00:00:43.487,,-2321

通过perl,

$ perl -pe 's~-(?=\d{2}\b)~/~g' file
   2014/06/04 00:00:06.487,,4324
   2014/06/04 00:00:43.487,,-2321

答案 2 :(得分:1)

另一种方法是使用sed的数字参数使其仅匹配1个模式,两次。 (无法在一个命令中设法完成此操作)。

$ echo '2014-06-04 00:00:43.487,,-2321' | sed -e 's@-@/@1;s@-@/@1'
2014/06/04 00:00:43.487,,-2321

您也可以使用相同的逻辑在Perl中轻松完成:

$ echo '2014-06-04 00:00:43.487,,-2321' |perl -ne 'print join("/", split(/-/, $_, 3));'
2014/06/04 00:00:43.487,,-2321