对于模式为file_20170321EXPR.tar.gz的文件目录中带有"EXPR“的文件
详情如下:
12.[3-8]x
14.[3-8]x
23.[3-8]x
因此,示例文件名如下:
...
file_2017032312.7a.tar.gz
file_2017032312.8a.tar.gz
file_2017032314.3a.tar.gz
file_2017032314.4a.tar.gz
file_2017032314.5a.tar.gz
file_2017032314.6a.tar.gz
file_2017032323.6a.tar.gz
file_2017032323.7a.tar.gz
file_2017032323.8a.tar.gz
....
有3号-8号文件的地方。当我尝试用grep
ls | grep -E "*[1|2][2|3|4]\.[3-8]x\.tar.\gz$"
我还会收到一些不想要的文件
13.[3-8]x
22.[3-8]x
24.[3-8]x
所以试着用
ls | grep -E "(*[1|2][2|3|4]\.[3-8]x\.tar.\gz" | grep -Ev "*13|22|24\."
但我将整个正则表达式作为一个参数发送给一个函数。因此需要任何方法将第一个正则表达式本身中的非必需表达式组合起来,如下所示
ls | grep -E "(*[1|2][2|3|4]\.[3-8]x\.tar.\gz$)|!(*13|22|24\.)"
这不起作用
发布于 2017-03-23 08:48:44
返回13.[3-8]
是因为[12][234]
匹配13
(以及12
、14
、22
、23
、24
)。注意,|
被视为文本|
,您需要删除它。您需要使用分组构造来只允许必需的值:
ls | grep -E "(1[24]|23)\.[3-8]x\.tar\.gz$"
^^^^^^^^^^
(1[24]|23)
将只匹配12
、14
或23
。
此外,在您的模式中,避免使用点,而不是g
。
详细信息
-(1[24]|23)
--两个选项之一:12
或14
,或(|
) 23
- \.
--文字点符号-- [3-8]
--一个括号表达式匹配3
、4
、5
、6
、d29或d30-d31-文字字符序列<>d32- $ -字符串的结尾。
https://stackoverflow.com/questions/42970848
复制相似问题