在 shell 中查找正则表达式时使用多个条件

在 shell 中查找正则表达式时使用多个条件

编辑:我需要使用 -E 来扩展正则表达式。

我有一个包含以下文件的文件夹(仅作为示例):
目录结构

我正在尝试查找所有文件:

  1. 以 . 开头和结尾#(例如#hi.h#
  2. 以 . 结尾~(例如file.txt~

我可以找到 1 个条件文件或 2 个条件文件,但我无法在一个正则表达式中合并它们。

$ find . -regex "./.*~"
./lld~

$ find . -regex "./#.*#"
./#x2#
./#x#

但是这个命令不起作用:

$ find . -regex "./(.*~$)|(#.*#)"

我做错了什么?我怎样才能组合这些正则表达式?

答案1

find . -regex "\./#.*#\|\./.*~"

这对你有用吗?

答案2

我需要使用-E扩展正则表达式。

调用find . -regextype help以了解可用选项。find我的 Debian 中的 GNU 支持很少。这有效:

find . -regextype posix-extended -regex '\./(.*~$|#.*#)'

注意:我已调试并简化了正则表达式(\./.*~$|\./#.*#也可以使用)。在此特定情况下对我有用的其他选项:posix-egrep,,,,,。egrepposix-awkawkgnu-awk


此命令:

find . -regex '\./#.*#\|\./.*~'

对我来说,逃逸在哪里|有效。致谢另一个答案. 正确转义()使得以下内容也能正常工作:

find . -regex '\./\(.*~$\|#.*#\)'

无需依赖扩展的正则表达式。


您不必将两个表达式压缩为一个。如果这些有效:

find . -regex '\./.*~'
find . -regex '\./#.*#'

然后您可以通过以下方式获取与一个正则表达式或另一个正则表达式匹配的文件:

find . -regex '\./.*~' -o -regex '\./#.*#'

被警告:为什么在 Linux 中使用find时会跳过预期结果?-o如果您想在之前和/或之后添加更多测试/操作,那么您不希望这样:

查找 . -test1 -test2 -regex '\./.*~' -o -regex '\./#.*#' -test3 …

但是这个:

find . -test1 -test2 '(' -regex '\./.*~' -o -regex '\./#.*#' ')' -test3 …

相关内容