基于模式匹配的sed子串操作

问题描述 投票:0回答:2

我有一系列格式为

%Y_%m_%dT%H%M%S
的日期时间。我正在编写一系列 sed 命令来生成格式
%Y-%m-%d %H:%M%:%S
。我知道我可以轻松提取时间段;但提取后有办法分裂吗?我会想到一些可能在 grep 中工作的技术,例如前向捕获,例如
s/(\d{2})(?\d)/$1:/g
,但这似乎不起作用。

(我知道有一种方法可以在 awk 中执行子字符串操作。但是由于 sed 是the流编辑器,我更愿意扩展我的技能并学习如何通过该工具来完成它。)

parsing sed substring
2个回答
1
投票

您可以捕获并稍后引用每个

%
部分:

$ echo 2023_10_05T174803 \
| sed 's/\([0-9][0-9][0-9][0-9]\)_\([01][0-9]\)_\([0-3][0-9]\)T\([0-2][0-9]\)\([0-5][0-9]\)\([0-5][0-9]\)/\1-\2-\3 \4:\5:\6/'
2023-10-05 17:48:03

您可以使用 Perl 来获得更简单的正则表达式,但在这种情况下它没有给您带来任何优势:

perl -pe 's/(\d{4})_([01]\d)_([0-3]\d)T([0-2]\d)([0-5]\d)([0-5]\d)/$1-$2-$3 $4:$5:$6/'

另请注意,

\d
还匹配除 [0-9] 之外的其他数字,有关详细信息,请参阅 https://stackoverflow.com/a/891741/1030675


0
投票

使用 GNU sed 或任何支持 ERE 的 sed:

sed -E 's/([0-9]{4})_([0-9]{2})_([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/'

如果日期时间是唯一的输入,我们可以稍微简化一下:

sed -E 's/_/-/g;s/T([0-9]{2})([0-9]{2})([0-9]{2})/ \1:\2:\3/'
© www.soinside.com 2019 - 2024. All rights reserved.