寻求适配三种场景的单行Sed日期转换命令方案
通用单行Sed命令处理三种日期场景
以下这条单行Sed命令可以同时适配你提到的三种输入场景:
sed -E -e 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/\2-\1-\3/' -e 's/-01-/-Jan-/;s/-02-/-Feb-/;s/-03-/-Mar-/;s/-04-/-Apr-/;s/-05-/-May-/;s/-06-/-Jun-/;s/-07-/-Jul-/;s/-08-/-Aug-/;s/-09-/-Sep-/;s/-10-/-Oct-/;s/-11-/-Nov-/;s/-12-/-Dec-/'
命令说明
-E参数:启用扩展正则表达式,简化分组和量词写法,避免大量转义符。- 第一个替换规则:匹配
MM/DD/YYYY格式的日期,将其重排为DD-MM-YYYY结构(调换日和月的位置,保留年份)。 - 后续替换规则:将月份数字逐一替换为对应的英文缩写(比如
-01-替换为-Jan-),最终得到DD-MMM-YYYY格式。 - 对
-----的处理:该命令仅匹配MM/DD/YYYY格式字符串,-----会完全保留,无需额外处理。
场景测试
场景1(两个有效日期):
输入:Invoice 03/15/2024 11/22/2023 Paid
输出:Invoice 15-Mar-2024 22-Nov-2023 Paid场景2(第一个日期有效,第二个为
-----):
输入:Order 07/04/2021 ----- Pending
输出:Order 04-Jul-2021 ----- Pending场景3(两个日期均为
-----):
输入:Draft ----- ----- Unprocessed
输出:Draft ----- ----- Unprocessed
如果你的日期固定在输入的特定字段(比如第2和第4个字段),可以使用更精准的版本,避免误匹配其他位置的类似格式:
sed -E -e 's/^([^ ]+ )([0-9]{2})\/([0-9]{2})\/([0-9]{4})( .* )(([0-9]{2})\/([0-9]{2})\/([0-9]{4})|-----)(.*)$/\1\3-\2-\4\5\6\9/' -e 's/-01-/-Jan-/;s/-02-/-Feb-/;s/-03-/-Mar-/;s/-04-/-Apr-/;s/-05-/-May-/;s/-06-/-Jun-/;s/-07-/-Jul-/;s/-08-/-Aug-/;s/-09-/-Sep-/;s/-10-/-Oct-/;s/-11-/-Nov-/;s/-12-/-Dec-/'
这个版本会严格匹配第2个字段的日期,以及第4个字段的日期或-----,适用于字段位置固定的输入记录。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

