Sed:替换日期格式

时间:2014-06-01 05:34:22

标签: 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

3 个答案:

答案 0 :(得分:2)

您的数字子表达式只匹配一个数字,但日期包含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

答案 1 :(得分:1)

尝试使用此GNU sed命令将包含日期字符串的所有行替换为您提到的字符串,

sed -ri 's/^.*([0-9]{4})-([0-9]{2})-([0-9]{2})\w*([0-9]{2}):([0-9]{2}):([0-9]{2})(.)(.*)$/\1-\2-\3 \4:\5\7/g' file

示例:

$ cat aa
jgklj 2014-06-01T03:11:00Z jhgkjhvk
blaf 2015-12-08T03:15:02Z bvcjghj

$ sed -r 's/^.*([0-9]{4})-([0-9]{2})-([0-9]{2})\w*([0-9]{2}):([0-9]{2}):([0-9]{2})(.)(.*)$/\1-\2-\3 \4:\5\7/g' aa
2014-06-01 03:11Z
2015-12-08 03:15Z

要仅替换日期并按原样打印所有其他文本,请运行以下命令。

sed -ri 's/^(.*)([0-9]{4})-([0-9]{2})-([0-9]{2})\w*([0-9]{2}):([0-9]{2}):([0-9]{2})(.)(.*)$/\1\2-\3-\5 \5:\6\8\9/g' file

示例:

$ cat aa
jgklj 2014-06-01T03:11:00Z jhgkjhvk
blaf 2015-12-08T03:15:02Z bvcjghj

$ sed -r 's/^(.*)([0-9]{4})-([0-9]{2})-([0-9]{2})\w*([0-9]{2}):([0-9]{2}):([0-9]{2})(.)(.*)$/\1\2-\3-\5 \5:\6\8\9/g' aa
jgklj 2014-06-03 03:11Z jhgkjhvk
blaf 2015-12-03 03:15Z bvcjghj

答案 2 :(得分:0)

您也可以使用此方法

$-sed -r 's/^([^T]+).((.*):){1,2}.([^Z])/\1 \3/g'