为什么在 find 命令的正则表达式中找不到连字符 - ?

为什么在 find 命令的正则表达式中找不到连字符 - ?

要识别文件名中带有连字符的文件-(例如 )test-19.1.txtfind与正则表达式组合的命令似乎不匹配。

该命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9\-\.]+\.txt' -exec echo {} \;在 bash shell 中运行,但未发现此类文件。如果从文件名中删除连字符,则正则表达式匹配。

测试时使用相同的正则表达式regexr.com是成功的。

答案1

要在字符类中包含连字符,它必须位于第一个或最后一个位置

查找手册 “find 和locate 使用的正则表达式类型与 GNU Emacs 中使用的几乎相同”和来自Emacs手册

  • [ ... ]
    • 要包含‘-’,请将其写‘-’为该组的第一个或最后一个字符,或将其放在范围后面。因此,‘[]-]’匹配‘]’‘-’

所以你的正则表达式应该是'.*/[a-z0-9.-]+\.txt'

在 POSIX BRE 和 ERE 中,适用相同的规则

如果该字符在列表中<hyphen-minus>首先出现(在首字母 后,如果有的话)或最后出现,或者作为范围表达式中的结束范围点,则应将其视为自身。'^'例如,表达式"[-ac]""[ac-]"是等效的并且匹配任何字符'a''c''-';"[^-ac]"和是等价的并且匹配除, , 或 之外的"[^ac-]"任何字符;表达式匹配介于和之间的任何字符;表达式匹配介于和之间的任何字符;并且该表达式无效或等效于,因为该字母位于POSIX 语言环境中的符号后面。要使用 a作为起始范围点,它应位于括号表达式的第一位或指定为整理符号;例如,,它匹配 a或任何字符或在0 和 0 之间进行排序的排序元素(包括 0 和 0)。'a''c''-'"[%--]"'%''-'"[--@]"'-''@'"[a--@]"'@''a''-'<hyphen-minus>"[][.-.]-0]"<right-square-bracket><hyphen-minus>

如果括号表达式同时指定'-'']',则']'应该放在括号表达式中的第一个('^'如果有的话)和最后一个。'-'

常用表达

事实上,大多数正则表达式变体都具有相同的匹配连字符的规则

连字符可以紧接在左括号之后、右括号之前或否定插入符号之后。[-x]和都[x-]匹配 x 或连字符。[^-x][^x-]匹配任何不是 x 或连字符的字符。这适用于本教程中讨论的所有风格。字符类中无法形成范围的其他位置的连字符可能会被解释为文字或错误。正则表达式的风格对此非常不一致。

字符类或字符集

答案2

尝试;

find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9.-]+\.txt'

在括号表达式内:

  • 破折号具有特殊含义范围。只有当破折号位于开头(在可选的 后面^,如果使用的话)或结尾时,才能避免这种特殊含义。
  • 一般来说,反斜杠不会转义下一个字符,它是一个文字\。特别是:不需要转义点,也没有办法用反斜杠转义破折号 ( -) 的特殊含义。

因此,您所写的内容被理解为从到(或只是)[a-z0-9\-\.]的范围。\\\

相关内容