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]*$'