在Unix中使用正则表达式查找模式,且不以另一个模式结尾。

10 浏览
0 Comments

在Unix中使用正则表达式查找模式,且不以另一个模式结尾。

我在SO上搜索了一些可能给我这个简单答案的东西,似乎是这里这里(还有很多其他地方),但我就是无法让它起作用。

我有一些文件,如下所示:

12_pattern1.yyy_zzz #find
13_pattern1.xxx.pattern2_xx 
12_yy_pattern1:xxx
14_pattern1.xxx_pattern2.xxx #find
12_xxx_zzz.yyy.xxx
14_pattern1.xxx.yyy #find

我需要查找并删除以1214开头,紧接着有_pattern1并且不以pattern2结尾的文件。

我尝试了类似于find . -regex ".*/\(12_\|14_\)pattern1.*[^pattern2$]" -exec rm -f {} \;的东西。

我在这里漏掉了什么?

0
0 Comments

Unix中的find命令可以根据正则表达式来查找文件。在给定的例子中,问题是如何使用正则表达式来匹配一组以特定前缀开头但不以特定后缀结尾的文件。

解决方法是使用find命令的正则表达式选项来指定匹配模式,并使用`-not`选项来排除以特定后缀结尾的文件。具体命令如下:

find . -regex "^\(12_\|14_\)pattern1.*" -not -regex "*.pattern2$"

这个命令使用了两个正则表达式。第一个正则表达式 `"^\(12_\|14_\)pattern1.*"` 匹配以"12_"或"14_"开头,后跟"pattern1"的文件名。第二个正则表达式 `"*.pattern2$"` 匹配以".pattern2"结尾的文件名。通过使用`-not`选项,我们可以排除匹配第二个正则表达式的文件。

这是一种解决这个问题的常见方法,因为在正则表达式中无法直接否定一个模式。使用`-not`选项可以实现排除特定模式的效果。

总结起来,通过在find命令中使用正则表达式选项和`-not`选项,我们可以指定匹配一组以特定前缀开头但不以特定后缀结尾的文件。这种方法是一种常见且有效的解决方案,因为在正则表达式中无法直接否定一个模式。

0
0 Comments

问题:如何使用正则表达式在Unix中查找不以某个模式结尾的文件?

在Unix中,find命令支持posix-*风格的正则表达式。这意味着你不能简单地使用find命令来完成这个任务。然而,如果你能使用grep命令,那么你可以很容易地做到(但需要两个工具的帮助):

find . | grep -P '(14|12)_pattern1[^/]*$(?<!pattern2)'

然后,使用以下命令删除找到的文件:

find . -type f -regex '(14|12)_pattern1[^/]*$(?<!pattern2)' -exec rm {} \;

抱歉,我没有仔细查看后面的选项。不,这种方式不可行。

0