正则表达式用于与排除项的大写匹配项



我正在尝试为以下情况提出一个正则表达式: 我需要使用以下路径的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

相关内容

  • 没有找到相关文章