SED正则命令作用解析及修改:完整提取斜杠后1-99范围数字
原SED命令逻辑拆解
你提供的SED命令仅实现日期格式转换功能,未涉及斜杠后目标数字的处理逻辑:
sed -r 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4})\s([0-9]{2}:[0-9]{2}:[0-9]{2})/\3\/\1\/\2 \4/g'
- 匹配规则:全局匹配所有
MM/DD/YYYY HH:MM:SS格式的日期时间字符串,即两位数字/两位数字/四位数字 + 空格 + 两位:两位:两位的时间格式 - 替换规则:将匹配到的日期重排为
YYYY/MM/DD HH:MM:SS格式,例如将01/01/2022 12:00:00转换为2022/01/01 12:00:00 - 故障原因:该命令完全没有修改
12345/15这类斜杠加数字的字段,正常执行时这段内容会原样保留。你遇到的斜杠后数字仅显示第一个字符的问题,要么是实际运行的脚本中还有其他截断逻辑,要么是原命令漏写了该字段的匹配规则,导致后续处理异常。
修复方案
方案1:保留整行内容,转换日期格式同时完整保留斜杠后1-99的数字
将命令调整为显式匹配行内所有字段,避免隐式截断,同时将SED分隔符替换为#减少转义符,提升可读性:
sed -r 's#([0-9]{2})/([0-9]{2})/([0-9]{4})\s([0-9]{2}:[0-9]{2}:[0-9]{2})\s+([0-9]{2})/([0-9]{2})/([0-9]{4})\s([0-9]{2}:[0-9]{2}:[0-9]{2})\s+[A-Z]+\s+[0-9]+/([1-9][0-9]?)\s+([0-9]+)#\3/\1/\2 \4 \7/\5/\6 \8 STATUS 12345/\9 \10#g' 输入文件.txt > 临时输出文件.txt
- 针对目标斜杠后数字的匹配使用
[1-9][0-9]?规则,可完整覆盖1-99的取值范围:匹配1-9时取单个数字,匹配10-99时取两位数字,不会出现只取第一位的问题 - 所有字段显式分组匹配,不会出现非预期的内容截断
方案2:仅提取斜杠后的目标数字
如果不需要保留整行,只需要拿到斜杠后的目标数字,可使用更精简的命令:
sed -n -r 's#.*[0-9]+/([1-9][0-9]?)[[:space:]]+[0-9]+$#\1#p' 输入文件.txt
针对你提供的示例行,该命令会直接输出15,无多余内容。
内容的提问来源于stack exchange,提问作者EnvyDev
相关产品推荐
相关产品推荐

