这篇文章上次修改于 718 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
有文件名为 1649790117_2022_04_13_14.8.2_gitlab_backup.tar,现需要提取文件命中部分字段的需求用于编写shell脚本进行自动化处理,可使用sed工具完成。
[root@git-server ~]# echo "1649790117_2022_04_13_14.8.2_gitlab_backup.tar" | sed -e 's/\([0-9]\{10,12\}\)_\([0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}\)_\([0-9]\+.[0-9]\+.[0-9]\+\)_gitlab_backup.tar/\1/g'
1649790117
[root@git-server ~]# echo "1649790117_2022_04_13_14.8.2_gitlab_backup.tar" | sed -e 's/\([0-9]\{10,12\}\)_\([0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}\)_\([0-9]\+.[0-9]\+.[0-9]\+\)_gitlab_backup.tar/\2/g'
2022_04_13
[root@git-server ~]# echo "1649790117_2022_04_13_14.8.2_gitlab_backup.tar" | sed -e 's/\([0-9]\{10,12\}\)_\([0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}\)_\([0-9]\+.[0-9]\+.[0-9]\+\)_gitlab_backup.tar/\3/g'
14.8.2
从上面的设定的正则表达式使用 \1
、\2
、\3
可分别提取出 1649790117
、2022_04_13
、14.8.2
三个字段,这是正则表达式捕获表达式()提供的功能。
表达式调试修改记录:
编写测试表达式:(\d{10,12})_(\d{4}_\d{2}_\d{2})_(\d+.\d+.\d+)_gitlab_backup.tar
使用在线测试网站解析结果如下,
可以看到正则表达式编写正常:正常匹配了文件名并捕获了所需的3个字段。
但将该正则表达式应用到sed
中时,发现并不能得到想要的结果,经查,\d
不是标准正则表达式宏,故sed不支持,所以使用[0-9]替换:
\d is a switch not a regular expression macro. If you want to use some predefined "constant" instead of [0-9] expression just try run this code
另外,sed命令中需要需要对正则表达式符号(如 +
、{
、(
等)进行转义处理。
已有 2 条评论
博主关闭了评论...
在线测试是用哪一个网站?我在regex101.com试了,无法匹配我在mac中,输出跟你的不一样:echo "1649790117_2022_04_13_14.8.2_gitlab_backup.tar" | sed -e 's/([0-9]{10,12})([0-9]{4}_[0-9]{2}_[0-9]{2})([0-9]+.[0-9]+.[0-9]+)_gitlab_backup.tar/\1/g'1649790117_2022_04_13_14.8.2_gitlab_backup.tar
@Jack 就是regex101.com。
我在CentOS7(sed (GNU sed) 4.2.2)系统上测试的,刚在Debian 11(sed (GNU sed) 4.7)中测试也是正常的。可能由于mac系统的sed工具不同吧。