我如何找到这个字符串?

我如何找到这个字符串?

我正在尝试使用 find 命令匹配这些文件名:

4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar

我对 Java-Perl 正则表达式语法相当熟悉。不幸的是,find 仅支持 emacs 和 posix 语法。

即使查看了 emacs 语法,我仍然无法使基本匹配起作用。

find . -regex "^[[:digit:]]+" -- matches nothing
find . -regex "^[[:digit:]]+.*(ALPHA\|BETA)\.jar" -- matches nothing

这在 Java 和 Perl 中非常简单,例如:

ls | grep -P "^\d+.*(ALPHA|BETA)\.jar"

作品。

答案1

使用 posix-awk 或 posix-extended regxtype 来匹配这些文件的正则表达式是:

find . -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"

因为 find -regex 进行匹配,而不是搜索

您可以使用 -regextype 指定正则表达式类型。请参阅 find 实现的手册页以检查支持哪些正则表达式引擎。

示例(无论目录深度如何,都获取文件):

root@smgw:/tmp# ls -1
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
one
root@smgw:/tmp# find . -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
./4702011-10-21CR719557-R85262-ALPHA.jar
./4702011-10-21CR719557-R85262-BETA.jar

移动罐子,确保它们仍然在原处

使用 abs 路径搜索它们

root@smgw:/tmp# find /tmp  -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
/tmp/4702011-10-21CR719557-R85262-ALPHA.jar
/tmp/4702011-10-21CR719557-R85262-BETA.jar

修改深度:

root@smgw:/tmp# mkdir -p x/y/z
root@smgw:/tmp# cp *^C
root@smgw:/tmp# mv *.jar x/y/z/
root@smgw:/tmp# find /tmp  -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
/tmp/x/y/z/4702011-10-21CR719557-R85262-ALPHA.jar
/tmp/x/y/z/4702011-10-21CR719557-R85262-BETA.jar

答案2

使用 emacs 样式来匹配你的模式的正则表达式可以是:

".*/[0-9]+-[0-9]+-[0-9A-Z]+-[0-9A-Z]+-\(ALPHA\|BETA\)\.jar$"

以下是我做的一个简单测试:

abarbosa@SPF-157:~/Temp/test$ ls -1
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
whatever.jar
abarbosa@SPF-157:~/Temp/test$ find . -regex ".*/[0-9]+-[0-9]+-[0-9A-Z]+-[0-9A-Z]+-\(ALPHA\|BETA\)\.jar$"
./4702011-10-21CR719557-R85262-BETA.jar
./4702011-10-21CR719557-R85262-ALPHA.jar

答案3

根据man find,这是一场整个路径,而不是搜索。因此,您必须使用如下命令:

$ find . -regex .*/[0-9]+.*\.jar

您还可以使用该选项将正则表达式类型更改为 posix-awk、posix-basic、posix-extended 等-regextype

相关内容