我想选择一些与正则表达式匹配的文件。 文件例如:
4510-88aid-50048-INA.txt
4510-88nid-50048-INA.txt
xxxx-05xxx-xxxxx-INA.txt
我想要所有符合此正则表达式的文件:
.*[\w]{4}-05(?!aid)[\w]{3}-[\w]{5}-INA\.txt
在我看来,在上面的案例中,这必须是xxxx-05xxx-xxxxx-INA.txt
。
使用像RegexTester这样的工具,一切都很完美。
使用bash命令find -regex
似乎不适合我。
我的问题是,为什么?
我无法理解,我正在使用:
find /some/path -regex ".*[\w]{4}-05(?!aid)[\w]{3}-[\w]{5}-INA\.txt" -exec echo {} \;
但没有印刷任何想法?
$ uname -a
Linux debmu838 2.6.5-7.321-smp #1 SMP Mon Nov 9 14:29:56 UTC 2009 x86_64 x86_64 x86_64 GNU/Linux
答案 0 :(得分:5)
bash4 +和perl
ls /some/path/**/*.txt | perl -nle 'print if /^[\w]{4}-05(?!aid)[\w]{3}-[\w]{5}-INA\.txt/'
你应该在.profile shopt -s globstar
答案 1 :(得分:4)
根据the find man page,查找正则表达式使用每个默认的emacs正则表达式。根据{{3}},emacs是GNU ERE,不支持环顾四周。
您可以尝试使用@ l0b0建议的其他-regextype
,但Posix风格似乎也不支持此功能。
答案 2 :(得分:2)
你有什么看起来像Perl正则表达式。尝试使用其他-regextype
,并相应地调整正则表达式:
更改正则表达式语法 由-regex和-iregex理解 稍后在命令上发生的测试 线。目前实现的类型是 emacs(这是默认值), posix-awk,posix-basic,posix-egrep 和posix-extended。
答案 3 :(得分:1)
我几乎和其他答案一样:Find -regex
开关无法模仿Perl的正则表达式中的所有内容,但是,这里有一些你可以尝试...
查看find2perl命令。该程序可以采用典型的查找语句,并为您提供相同的Perl程序。我不认为-regex
被find2perl
识别(它不在标准的Unix查找中,而只在GNU查找中),但你只需使用-name
,然后看到它生成的程序。从那里,您可以修改程序以使用正则表达式中所需的Perl表达式。最后,您将获得一个小的Perl脚本,它将执行您想要的文件目录。
否则,请尝试使用-regextype posix-extended
,它与Perl的正则表达式 非常匹配。你不能使用环顾四周,但你可能会发现一些有用的东西。
答案 4 :(得分:0)
试试这个:
ls ????-??aid-?????-INA.txt
答案 5 :(得分:0)
尝试这样的简单脚本:
#!/bin/bash
for file in *INA.txt
do
match=$(echo "${file%INA.txt}" | sed -r 's/^\w{4}-\w{5}-\w{5}-$/found/')
[ $match == "found" ] && echo "$file"
done