Regex 带排除项的大写匹配的正则表达式
我试图为以下情况提供一个正则表达式:我需要为以下路径使用Regex 带排除项的大写匹配的正则表达式,regex,bash,grep,Regex,Bash,Grep,我试图为以下情况提供一个正则表达式:我需要为以下路径使用grep查找任何匹配路径: 包括所有大写匹配路径。 例如: com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT.jar 请注意栏中的大写字母B 排除仅包含快照且没有其他大写字母的所有大写匹配路径。 例如: com/foo/bar/1.2.3-SNAPSHOT/bar-1.2.3-SNAPSHOT.jar 如果您只想获得匹配的文件,是否可以使用grep?。我会这样做的 find . -type f
grep
查找任何匹配路径:
- 包括所有大写匹配路径。
例如:
com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT.jar
请注意
栏中的大写字母
B
- 排除仅包含
且没有其他大写字母的所有大写匹配路径。 例如: com/foo/bar/1.2.3-SNAPSHOT/bar-1.2.3-SNAPSHOT.jar快照
如果您只想获得匹配的文件,是否可以使用
grep
?。我会这样做的
find . -type f -regex '.*[A-Z].*' | while read -r line; do echo "$line" | sed 's/SNAPSHOT//g' | grep -q '.*[A-Z].*' && echo "$line"; done
这样做可能会:
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
对于gensub(),使用GNU awk或mawk:
对于其他AWK:
$ 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
贪婪地将所有内容匹配到第一个斜杠。由于*\/
查找,始终会有一个斜杠。
查找所有非大写字母的字符。因此,我们在快照文字之前和之后应用它,直到字符串末尾[^A-Z]*
你可以在网上玩。谢谢你给我这样的凡人提供了简单的例子和详细的分类!
find . | grep '[A-Z]' | grep -v '.*\/[^A-Z]*SNAPSHOT[^A-Z]*$'