如何用CentOS7的GNU sed 4.2.2提取文件名中的日期子串?
解决GNU sed提取文件名中日期子串的问题
正确命令示例
针对文件名backup_20240827000025.sql,使用CentOS7的GNU sed 4.2.2提取8位日期子串,可执行以下命令:
string=backup_20240827000025.sql echo $string | sed -r 's/^.*_([0-9]{8})[0-9]{6}\.sql/\1/'
执行后会输出:20240827
如果文件名前缀固定为backup_,也可以用更精准的正则:
echo $string | sed -r 's/^backup_([0-9]{8}).*\.sql/\1/'
你的命令错误分析
第一个命令报错原因:
你使用了-r选项(启用扩展正则表达式),但捕获组却用了基础正则的写法\([0-9]{8}\),这会让括号变成普通字符,无法形成捕获组,导致\1引用无效,触发报错。在扩展正则中,捕获组直接用()即可,不需要转义。第二个命令原样返回原因:
你的正则里包含\.\/(匹配./前缀),但实际变量string的值是backup_20240827000025.sql,没有./前缀,导致整个正则匹配失败,sed默认会输出原字符串。另外正则末尾多余的逗号也是匹配失败的原因之一。Python能成功的原因:
推测你在Python中处理的是带./前缀的文件路径(比如./backup_20240827000025.sql),所以正则中的\.\/能匹配到前缀,进而捕获到日期子串;但在sed命令中你处理的是不带前缀的文件名,自然匹配不上。
内容的提问来源于stack exchange,提问作者Stanislav
相关产品推荐
相关产品推荐

