我正在尝试为以下情况提出一个正则表达式...
我们正在清理一些错误地部署到存储库的 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 格式的情况。
我不确定为什么您尝试将文件名与grep
匹配。但这是查找所有不匹配文件的find
命令:
find . -type f ! -regex '.*/([^/]*)/([^/]*)/1-2[^/]*'
我只匹配artifactId
和version
,因为您没有精确指定任何其他内容(显然甚至没有强制要求.jar
扩展(blah/1.zip
没有将.zip
列为错误))。
要删除有问题的文件,只需将-delete
添加到find
调用中:
find . -type f ! -regex '.*/([^/]*)/([^/]*)/1-2[^/]*' -delete
编辑1:grep
的相同正则表达式:
egrep -v '^.*/([^/]*)/([^/]*)/1-2[^/]*$'
你可以试试:
^(?![w/]*/(w+)/([w-]+)/([d.]+)/2-3(-w+)?.(w+)).*$
它将捕获不同组中的不同部件,并验证所需的部件是否存在。
在 regex101 上看到它。
编辑:
错过了您对不匹配的那些感兴趣的事实。更改了正则表达式和示例。