这篇文章上次修改于 512 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

有文件名为 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可分别提取出 16497901172022_04_1314.8.2三个字段,这是正则表达式捕获表达式()提供的功能。

表达式调试修改记录:
编写测试表达式:
(\d{10,12})_(\d{4}_\d{2}_\d{2})_(\d+.\d+.\d+)_gitlab_backup.tar
使用在线测试网站解析结果如下,
regex.png
可以看到正则表达式编写正常:正常匹配了文件名并捕获了所需的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命令中需要需要对正则表达式符号(如 +{(等)进行转义处理。