Bash grep 的正则表达式否定问题
Bash regex negation issue with grep
对于模式为 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\.)"
这行不通
返回 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
、7
或 8
的括号表达式
- x\.tar\.gz
- 文字字符序列 x.tar.gz
- $
- 字符串结尾。
对于模式为 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\.)"
这行不通
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
、7
或 8
的括号表达式
- x\.tar\.gz
- 文字字符序列 x.tar.gz
- $
- 字符串结尾。