regex 如何指定只包含特定字符一定次数的模式

kzmpq1sx  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(85)

我使用假名数据,其中假名是9个字符长的字符串,包含字母a到f或数字0到9。
如何使ls只显示具有此类名称的条目?这也适用于grepfind吗?
我知道我可以将单个字符指定为[a-f,0-9],但如何指定这样的字符出现9次?

zfycwa2u

zfycwa2u1#

ls:

ls | grep -E '^[a-f0-9]{9}$'

查找:

find /path/to/directory -type f -regex '.*/[a-f0-9]{9}$'
eeq64g8w

eeq64g8w2#

唉,即使使用extglob选项,也无法在bash中只进行普通模式匹配,除非重复9次[a-f0-9]

r=[a-f0-9];ls $r$r$r$r$r$r$r$r$r

或(少3个字符):

r=[a-f0-9];s=$r$r$r;ls $s$s$s

但是你也可以使用循环和条件表达式的=~运算符:

for f in *; do [[ "$f" =~ ^[a-f0-9]{9}$ ]] && echo "$f"; done

如果在同一目录中有许多不匹配的文件,则可以使用extglob选项将搜索限制为仅包含有效字符的文件名,并对长度进行简单测试:

( shopt -s extglob; for f in +([a-f0-9]); do (( "${#f}" == 9 )) && echo "$f"; done; )

(the子shell ( ... ),以便之后自动恢复原始extglob状态)
对于grepfind等外部实用程序,要使用的正则表达式与=~相同:^[a-f0-9]{9}$

相关问题