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(以及 1214222324)。请注意 | 被视为文字 |,您需要将其删除。您需要使用分组结构来只允许必要的值:

ls | grep -E "(1[24]|23)\.[3-8]x\.tar\.gz$"
              ^^^^^^^^^^

(1[24]|23) 只会匹配 121423.

此外,在您的模式中转义点,而不是 g

详情:

-(1[24]|23) - 两种选择之一:1214,或 (|) 23 - \. - 文字点符号 - [3-8] - 匹配 345678 的括号表达式 - x\.tar\.gz - 文字字符序列 x.tar.gz - $ - 字符串结尾。