我正在尝试为以下情况提出一个正则表达式: 我需要使用以下路径的grep
找到任何匹配的路径:
-
包括所有大写匹配路径。例:
com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT
.jar请注意
Bar
中的大写B
。 -
排除仅包含
SNAPSHOT
且没有其他大写字母的所有大写匹配路径。例:com/foo/bar/1.2.3-SNAPSHOT/bar-1.2.3-SNAPSHOT
.jar
这可以用grep
吗?
这样的事情可能会做:
grep -vE '^([^[:upper:]]*(SNAPSHOT)?)*$'
故障:
-v
将反转匹配(显示所有不匹配的行。 -E
启用了扩展正则表达式。
^ # Start of line
( )* # Capturing group repeated zero or more times
[^[:upper:]]* # Match all but uppercase zero or more times
(SNAPSHOT)? # Followed by literal SNAPSHOT zero or one time
$ # End of line
只需使用 awk:
$ cat file
com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT.jar
com/foo/bar/1.2.3-SNAPSHOT/bar-1.2.3-SNAPSHOT.jar
使用 GNU awk 或 mawk for gensub():
$ awk 'gensub(/SNAPSHOT/,"","g")~/[[:upper:]]/' file
com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT.jar
与其他尴尬:
$ awk '{r=$0; gsub(/SNAPSHOT/,"",r)} r~/[[:upper:]]/' file
com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT.jar
好吧,您需要find
列出所有路径。然后,您可以使用两次运行grep
来完成此操作。一个包括所有死刑案件。另一个不包括不包含大写字母,除了SNAPSHOT
:
find . | grep '[A-Z]' | grep -v '.*/[^A-Z]*SNAPSHOT[^A-Z]*$'
我认为只有最后一个 grep 需要一些解释:
-
grep -v
排除匹配行 -
.*/
贪婪地将所有内容匹配到第一个斜杠。总会因为find .
而斜杠 -
[^A-Z]*
查找所有非大写字母的字符。因此,我们在 SNAPSHOT 文本之前和之后应用它,直到字符串的末尾。
在这里,您可以在线玩它。
如果您只想获取匹配的文件。我会这样做。
find . -type f -regex '.*[A-Z].*' | while read -r line; do echo "$line" | sed 's/SNAPSHOT//g' | grep -q '.*[A-Z].*' && echo "$line"; done