使用正则表达式查找命令未按预期工作

Posted

技术标签:

【中文标题】使用正则表达式查找命令未按预期工作【英文标题】:Find command with regex not working as intended 【发布时间】:2021-07-16 10:49:22 【问题描述】:

我正在尝试打印文件名中不包含 imdb id 的所有文件。对于那些不知道的人,这里有一些 id 的示例

tt0111161
tt0068646
tt0071562
tt0468569
tt0050083
tt0108052
tt0167260
tt0110912
tt0060196
tt0120737

为了便于回答这个问题,我创建了 10 个文件,其中 5 个的名称中有这些 id,其余的没有。

❯ ls
'random_name1 tt9264728.mp4'   
'random_name2 tt0111161.mp4'       
'random_name3 tt0071562.mp4'   
'random_name4 tt0050083.mp4'
'random_name5 tt0108052.mp4' 
'random name6.mp4'
'random name7.mp4'
'random name8.mp4'
'random name9.mp4'
'random name10.mp4'   
       
❯find . -regextype sed -not -regex "tt\d7" -type f -print     
                         
./random_name4 tt0050083.mp4
./random_name1 tt9264728.mp4
./random name6.mp4
./random name7.mp4
./random_name3 tt0071562.mp4
./random_name2 tt0111161.mp4
./random_name5 tt0108052.mp4
./random name8.mp4
./random name9.mp4
./random name10.mp4

从上面可以看出,find 也在打印那些名称中有 id 的文件。由于某种我不需要的原因,它还在每个结果之前添加了“./”。

预期结果-

random name6.mp4
random name7.mp4
random name8.mp4
random name9.mp4
random name10.mp4

【问题讨论】:

【参考方案1】:

由于您使用的是 POSIX BRE 正则表达式风格,因此以下内容适合您:

find . -regextype sed -not -regex ".*tt[0-9]\7\[^/]*$" -type f -print

注意:

您需要在 POSIX BRE 的范围量词中转义 不支持 \d,您需要 [0-9] 来匹配 POSIX 正则表达式中的数字 您需要提供一个与find 正则表达式模式中的整个 字符串匹配的模式。

正则表达式匹配

.* - 任何文本,零个或多个字符 tt - tt 字符串 [0-9]\7\ - 七位数 [^/]* - 除了/ char 之外的零个或多个字符 $ - 字符串结束。

【讨论】:

以上是关于使用正则表达式查找命令未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

LDAP olcAccess 正则表达式未按预期工作

NSpredicate 上的正则表达式未按预期工作

NLTK - nltk.tokenize.RegexpTokenizer - 正则表达式未按预期工作

js 正则表达式未按预期工作。未检测到换行符[重复]

C++ 11 正则表达式未按预期返回组

正则表达式未按预期进行评估