我有一堆文件都以'_'结尾,三个数字和'.csv'结尾。 我想删除那些不以'_005.csv','007.csv','008.csv'和'_111.csv'结尾的那些。
我尝试删除所有匹配^.*_(?!005|007|008|111)\.csv$
的内容,但它不起作用。我该怎么做?
答案 0 :(得分:1)
如果你在POSIX系统上,你可以这样做:
ls -1 | grep -vE "_(00[578]|111)\.csv$" | xargs rm
或者您可以使用否定前瞻,正如您在问题中所尝试的那样。要记住的一件事是负向前瞻(?! )
内的字符不是匹配的一部分,因此您还必须指定匹配。换句话说,你的正则表达式是这样的:
_(?!(00[578]|111))[0-9]{3}\.csv$
要打破它,首先考虑这个正则表达式:
_[0-9]{3}\.csv$
这将匹配所有以_
结尾的文件,三位数字和.csv
。
现在我们添加负前瞻以排除我们的特定情况。因此,您在(?!(00[578]|111))
之后插入_
并最终得到上述内容。
同样,在POSIX系统上你可以这样做:
ls -1 | grep -P "_(?!(00[578]|111))[0-9]{3}\.csv$" | xargs rm
答案 1 :(得分:0)
怎么样
^.*_(?:(?!005))(?:(?!007))(?:(?!008))(?:(?!111))\.csv$
答案 2 :(得分:0)
此正则表达式不会捕获文件'_005.csv','007.csv','008.csv'和'_111.csv'。
正则表达式:_(?:(00)|(11)|([1-9][02-9]))(?(1)[^578])(?(2)[^1])(?(3)\d)\.csv$
<强>详情:
(?:)
非捕获组
(00)|(11)|([1-9][02-9])
备选方案
|
或
[]
匹配列表中的单个字符
[^]
匹配列表中不存在的单个字符
(?(n))
如果Group n
则