正则表达式:快速入门

有时候我们不知道确切的文件名,只知道命名模式。比如要查找以 db- 开头、中间是日期、以 .sql 结尾的文件,就可以使用正则表达式进行模式匹配。

先准备一份文件名测试清单:

crow@opsbox:~/work$ cp /srv/ops/practice/file-names.txt .
crow@opsbox:~/work$ cat file-names.txt
db-2026-06-28.sql
db-2026-06-30.sql
db-2026-06-30.sql.gz
db-2026-07-01.sql
notes.txt
db-2026-06-3X.sql

用 grep 做基础模式匹配

使用 grep -E 可以启用扩展正则表达式:

crow@opsbox:~/work$ grep -E '\.sql$' file-names.txt
db-2026-06-28.sql
db-2026-06-30.sql
db-2026-07-01.sql
db-2026-06-3X.sql

这里有两个关键点:

  • $:表示行尾,所以只匹配以 .sql 结尾的行,排除了 .sql.gz;
  • \.:转义普通句点,匹配真实的小数点。如果直接写 .,在正则中它代表任意一个字符。

如果想精确匹配“六月份、日期为两位数字的 SQL 文件”:

crow@opsbox:~/work$ grep -E '^db-2026-06-[0-9]{2}\.sql$' file-names.txt
db-2026-06-28.sql
db-2026-06-30.sql

各部分含义如下:

  • ^:表示行首;
  • [0-9]{2}:表示恰好两个连续数字,因此能排除 3X 这种非法日期。

如果想同时匹配六月和七月的备份文件:

crow@opsbox:~/work$ grep -E '^db-2026-(06|07)-[0-9]{2}\.sql$' file-names.txt
db-2026-06-28.sql
db-2026-06-30.sql
db-2026-07-01.sql
  • (06|07):表示匹配 06 或 07;
  • |:在正则中通常表示“或”。

把压缩备份也选进来

练习

修改上面的规则,在 file-names.txt 中选出六月或七月的备份文件名,日期仍须为两位数字,但结尾可以是 .sql 或 .sql.gz。符合条件的行一共有几行?只提交数字。

提交答案

题解 Hint