在Unix中使用正则表达式查找模式,且不以另一个模式结尾。
在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
我需要查找并删除以12
或14
开头,紧接着有_pattern1
并且不以pattern2
结尾的文件。
我尝试了类似于find . -regex ".*/\(12_\|14_\)pattern1.*[^pattern2$]" -exec rm -f {} \;
的东西。
我在这里漏掉了什么?
Unix中的find命令可以根据正则表达式来查找文件。在给定的例子中,问题是如何使用正则表达式来匹配一组以特定前缀开头但不以特定后缀结尾的文件。
解决方法是使用find命令的正则表达式选项来指定匹配模式,并使用`-not`选项来排除以特定后缀结尾的文件。具体命令如下:
find . -regex "^\(12_\|14_\)pattern1.*" -not -regex "*.pattern2$"
这个命令使用了两个正则表达式。第一个正则表达式 `"^\(12_\|14_\)pattern1.*"` 匹配以"12_"或"14_"开头,后跟"pattern1"的文件名。第二个正则表达式 `"*.pattern2$"` 匹配以".pattern2"结尾的文件名。通过使用`-not`选项,我们可以排除匹配第二个正则表达式的文件。
这是一种解决这个问题的常见方法,因为在正则表达式中无法直接否定一个模式。使用`-not`选项可以实现排除特定模式的效果。
总结起来,通过在find命令中使用正则表达式选项和`-not`选项,我们可以指定匹配一组以特定前缀开头但不以特定后缀结尾的文件。这种方法是一种常见且有效的解决方案,因为在正则表达式中无法直接否定一个模式。
问题:如何使用正则表达式在Unix中查找不以某个模式结尾的文件?
在Unix中,find
命令支持posix-*
风格的正则表达式。这意味着你不能简单地使用find
命令来完成这个任务。然而,如果你能使用grep
命令,那么你可以很容易地做到(但需要两个工具的帮助):
find . | grep -P '(14|12)_pattern1[^/]*$(?<!pattern2)'
然后,使用以下命令删除找到的文件:
find . -type f -regex '(14|12)_pattern1[^/]*$(?<!pattern2)' -exec rm {} \;
抱歉,我没有仔细查看后面的选项。不,这种方式不可行。