我试图为以下案例提出一个正则表达式...
我们正在清理一些未正确部署到存储库的Maven工件。用于命名工件的Maven格式如下:
${groupId}/${artifactId}/${version}/${artifactId}-${version}-${classifier}.jar
其中:
groupId
:工件的组ID(通用包名称),例如com.foo
(由Maven将点扩展为通配符)artifactId
:工件的ID,例如bar
version
:版本,例如1.2.3
classifier
:这是一个可选属性,允许您指定子工件,例如sources
,javadocs
,jdk14
等等。 ,或者可能不存在。以下是一些有效路径:
com/foo/bar/1.2.3/bar-1.2.3.jar
com/foo/bar/1.2.3/bar-1.2.3.pom
com/foo/blah/1.2.3/blah-1.2.3.jar
com/foo/blah/1.2.3/blah-1.2.3.pom
com/foo/blah/1.2.3/blah-1.2.3-javadocs.jar
com/foo/blah/1.2.3/blah-1.2.3-sources.jar
com/foo/blah/1.2.3-SNAPSHOT/blah-1.2.3-SNAPSHOT.jar
com/foo/blah/1.2.3-SNAPSHOT/blah-1.2.3-SNAPSHOT.pom
com/foo/blah/1.2.3-SNAPSHOT/blah-1.2.3-SNAPSHOT-javadocs.jar
com/foo/blah/1.2.3-SNAPSHOT/blah-1.2.3-SNAPSHOT-sources.jar
com/foo/myapp/user-management/1.2.3/user-management-1.2.3.jar
com/foo/myapp/user-management/1.2.3/user-management-1.2.3.pom
我需要使用grep
(因为我在存储库中有大量文件列表)找到任何匹配的无效路径,以便进行以下操作:
com/foo/bar/1.2.3/blah.jar {notice how:
a) the artifactId is not part of the file name;
b) there is no specified version
In this case com/foo would be the groupId,
but blah is not the artifactId
and there is no version
}
blah/1.zip {notice how there is no:
a) artifactId
b) version component of the path
}
以上说明了不遵循开头解释的Maven格式的情况。
答案 0 :(得分:2)
你可以尝试:
^(?![\w\/]*\/(\w+)\/([\w-]+)\/([\d.]+)\/\2-\3(-\w+)?\.(\w+)).*$
它会在不同的组中捕获不同的部分,并验证所需的部分是否存在。
修改强>
错过了您对不匹配感兴趣的事实。更改了正则表达式和示例。
答案 1 :(得分:2)
我不确定您为何尝试将文件名与grep
匹配。但是这里是find
命令来查找所有不匹配的文件:
find . -type f ! -regex '.*/\([^/]*\)/\([^/]*\)/\1-\2[^/]*'
我只匹配artifactId
和version
,因为您还没有准确指定任何其他内容(显然甚至没有强制.jar
扩展名blah/1.zip
}不会将.zip
列为错误))。
要删除有问题的文件,只需将-delete
添加到find
调用中:
find . -type f ! -regex '.*/\([^/]*\)/\([^/]*\)/\1-\2[^/]*' -delete
Edit1:grep
的相同正则表达式:
egrep -v '^.*/([^/]*)/([^/]*)/\1-\2[^/]*$'