首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从全球匹配中排除模式

从全球匹配中排除模式
EN

Unix & Linux用户
提问于 2022-06-18 20:58:26
回答 2查看 1.2K关注 0票数 6

我的目录如下所示:

代码语言:javascript
复制
$ ls
total 0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file1
-rw-r--r-- 1 user user 0 Jun 18 22:44 file2
-rw-r--r-- 1 user user 0 Jun 18 22:44 file3
-rw-r--r-- 1 user user 0 Jun 18 22:44 file4
-rw-r--r-- 1 user user 0 Jun 18 22:44 file5
-rw-r--r-- 1 user user 0 Jun 18 22:44 file6
-rw-r--r-- 1 user user 0 Jun 18 22:44 file7
-rw-r--r-- 1 user user 0 Jun 18 22:44 file8
-rw-r--r-- 1 user user 0 Jun 18 22:44 file9

使用bash,我想将file2file6相匹配,不包括file3

由于找不到匹配多个模式的and操作符,所以我认为我只是使用了DeMorgan的定律,即a AND b等价于!(!a OR !b)并编写

代码语言:javascript
复制
!(!(file[2-6])|file3)

如预期的那样工作:

代码语言:javascript
复制
$ echo !(!(file[2-6])|file3)
file2 file4 file5 file6

是否有更简单、更直接的方法来实现这一目标?

EN

回答 2

Unix & Linux用户

发布于 2022-06-18 21:38:44

您可以应用两个范围[24-6],其中2是第一个,4-6是第二个:

代码语言:javascript
复制
$ ls file[24-6]
file2 file4 file5 file6

另一个例子是:

代码语言:javascript
复制
$ ls file[2356]
file2 file3 file5 file6

文档:

范围有一个特殊的约定:用'-‘分隔的两个字符表示范围。(因此,"“相当于”“。)可以在字面意思中包括“-”,使其成为括号之间的第一个或最后一个字符。(因此,"[]-]“只匹配两个字符‘]和'-',以及"”匹配这三个字符’‘,'.','0',因为'/’不能匹配。)

票数 4
EN

Unix & Linux用户

发布于 2022-06-18 23:12:42

否定范围:

代码语言:javascript
复制
printf '%s\n' file[!013789]

如前所述

如果“(”)后面的第一个字符是“!”或者是“^”,那么任何没有括起来的字符都是匹配的。

GLOBIGNORE设置为要跳过的文件:

代码语言:javascript
复制
GLOBIGNORE="file0:file1:file3:file7:file8:file9"
printf '%s\n' file*

看看这个

GLOBIGNORE变量可用于限制匹配模式的文件名集。如果设置了GLOBIGNORE,则从匹配列表中删除与GLOBIGNORE中的模式之一匹配的每个文件名。

使用extended globbing

代码语言:javascript
复制
shopt -s extglob
printf '%s\n' file!([013789])

见扩展球状

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/706682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档