linux - Sed:替换日期格式

标签 linux date unix awk sed

我有一个文本文件,其中每一行都有一个日期字符串 "2014-06-01T03:11:00Z "。我想使用 sed 将其替换为 "2014-06-01 03:11Z "

我一直在尝试使用这段代码,但它让我失望了:

sed -i 's/[0-9]-[0-9]-[0-9]T[0-9]:[0-9]:[0-9]Z/[0-9]-[0-9]-[0-9] [0-9]:[0-9]Z/g' \
    /home/aaron/grads/data/metars/${YMD}/latest.metars

最佳答案

您的数字子表达式仅匹配一个数字,但日期包含 2 或 4 位数字。匹配日期的简单版本是:

sed -i 's/\([0-9]*-[0-9]*-[0-9]*\)T\([0-9]*:[0-9]*\):[0-9]*Z/\1 \2Z/g' \
    /home/aaron/grads/data/metars/${YMD}/latest.metars

但是,这会在每个需要数字的位置匹配零个或多个数字。您真的想坚持每个段中的正确位数。一个更精炼的版本是:

sed -i 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)T\([0-9]\{2\}:[0-9]\{2\}\):[0-9]\{2\}Z/\1 \2Z/g' \
    /home/aaron/grads/data/metars/${YMD}/latest.metars

并且由于您的 sed 支持 -i 而无需指定备份后缀(因此它可能是 GNU sed),您可能可以缩写为:

sed -r -i 's/([0-9]{4}-[0-9]{2}-[0-9]{2})T([0-9]{2}:[0-9]{2}):[0-9]{2}Z/\1 \2Z/g' \
    /home/aaron/grads/data/metars/${YMD}/latest.metars

关于linux - Sed:替换日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23977052/

相关文章:

Linux:对于 "tail -f filename",是否仅在\n 之后跟随读取行?

php - 从 php/linux 获取 pdf 的布局模式(横向或纵向)

java - dailymotion视频api,created_time返回不正确

ios - 无法在 Swift 4 中解码日期

sql-server - TryParse SSIS 忽略源行

c - 如何从函数返回一个 char 值?在 Unix 中

linux -/etc/hosts 带有别名或附加时的行为是什么?

bash - unix 对 2 个字段的数字顺序进行排序

java - 您会推荐哪种 Java 服务或守护进程框架?

python - 如何让Python程序读取文件中的行