我有一个带有时间戳的文件
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做到这一点,我将如何做到这一点?
答案 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