![使用 sed 命令替换字符串中前 2 次出现的“:”](https://linux22.com/image/125826/%E4%BD%BF%E7%94%A8%20sed%20%E5%91%BD%E4%BB%A4%E6%9B%BF%E6%8D%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E5%89%8D%202%20%E6%AC%A1%E5%87%BA%E7%8E%B0%E7%9A%84%E2%80%9C%3A%E2%80%9D.png)
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