使用 sed 命令替换字符串中前 2 次出现的“:”

使用 sed 命令替换字符串中前 2 次出现的“:”

YYYY:MM:DD HH:MM:SS我正在尝试使用 date (bash) 命令来比较格式中的 2 个日期。我的问题是 date 命令仅使用日期格式(据我所知)YYYY-MM-DD HH:MM:SS。我试图将 sed 与正则表达式一起使用来替换前两次出现的:with-但我无法让它工作。我才到2018年。

date1="2018:01:16 12:25:35"
echo $date1 | sed 's/\([0-9]*\).*/\1/'

我会接受任何可能的建议,谢谢。

答案1

只需做两次简单的替换:

sed 's/:/-/;s/:/-/'

答案2

[按要求回答问题 - 尽管这可能不是解决实际日期比较问题的最佳方法]

一种方法是使用循环一次替换一个冒号,当结果包含两个连字符时跳出循环:

echo '2018:01:16 12:25:35' | sed ':a; /^[^-]*-[^-]*-/ b; s/:/-/; ta'
2018-01-16 12:25:35

或者,如果您有 GNU sed,您可以替换全部冒号带有连字符,然后从第三个连字符开始再次用冒号替换:

echo '2018:01:16 12:25:35' | sed 'y/:/-/; s/-/:/3g'
2018-01-16 12:25:35

答案3

| sed 's/\([0-9]*\).*/\1/'

这保存了第一串数字,然后吃掉了之后的所有数字.*,然后将这些数字放回去,所以实际上,之后的所有内容都2018消失了。

您需要捕获前两个数字字符串,加上分隔符来替换它们,并且不是匹配该行的其余部分:

$ echo "2018:01:16 12:25:35" | sed 's/\(....\):\(..\):/\1-\2-/'
2018-01-16 12:25:35

答案4

我使用了以下两种方法来达到上述结果

方法1使用awk gsub函数

echo $date1| awk '{gsub(":","-",$1);print $0}'

输出2018-01-16 12:25:35

方法2使用sed

echo $date1 |sed "s/:/-/"| sed "s/:/-/"

输出2018-01-16 12:25:35

方法3 使用perl

echo $date1| perl -pne "s/:/-/"| perl -pne "s/:/-/"

输出2018-01-16 12:25:35

相关内容