我有一个文本文件,其中每行有一个日期字符串“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而不指定备份后缀(因此它可能是GNUsed),您可以将其缩写为:
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

09-20 18:13