我使用假名数据,其中假名是9个字符长的字符串,包含字母a到f或数字0到9。如何使ls只显示具有此类名称的条目?这也适用于grep和find吗?我知道我可以将单个字符指定为[a-f,0-9],但如何指定这样的字符出现9次?
ls
grep
find
[a-f,0-9]
zfycwa2u1#
ls:
ls | grep -E '^[a-f0-9]{9}$'
查找:
find /path/to/directory -type f -regex '.*/[a-f0-9]{9}$'
eeq64g8w2#
唉,即使使用extglob选项,也无法在bash中只进行普通模式匹配,除非重复9次[a-f0-9]:
extglob
[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状态)对于grep和find等外部实用程序,要使用的正则表达式与=~相同:^[a-f0-9]{9}$。
( ... )
^[a-f0-9]{9}$
2条答案
按热度按时间zfycwa2u1#
ls:
查找:
eeq64g8w2#
唉,即使使用
extglob
选项,也无法在bash中只进行普通模式匹配,除非重复9次[a-f0-9]
:或(少3个字符):
但是你也可以使用循环和条件表达式的
=~
运算符:如果在同一目录中有许多不匹配的文件,则可以使用
extglob
选项将搜索限制为仅包含有效字符的文件名,并对长度进行简单测试:(the子shell
( ... )
,以便之后自动恢复原始extglob
状态)对于
grep
和find
等外部实用程序,要使用的正则表达式与=~
相同:^[a-f0-9]{9}$
。