ls | grep正则expression式,忽略.tab文件,

我知道一些正则expression式,但我不知道如何得到这个工作。 我想列出所有没有.tab的文件。 并没有〜在文件名的末尾,不是.o(或.bin)

我可以列出所有.tab文件。 通过写作

ls | grep .tab. 

但是我不知道如何让它忽略这些文件并列出其他所有内容。 我试过了

 ls | grep [^(.tab.)] 

但有一个错误,并认为我最后的正则expression式会是

 ls | grep ([^(.tab.)]|.o$|.bin$) 

但是我从来没有做过太多的正则expression式,所以我相信即使语法正确,最终的结果也是错误的。

我将如何做这将取决于上下文。 如果这不是一个脚本,我只是想看到这一点,我会好的使用ls:

 ls -a | egrep -v '(tab|\.o$|\.bin$|~$)' 

如果在脚本中,我会使用循环:

 for file in *; do #file $file in .* *; do -- To Include dot (hidden files) if ! egrep -q '(tab|\.o$|\.bin$|~$)' <<<$file; then echo $file fi done 

如果你只想要普通文件而不是目录,你可以添加另外一个testing。 如果你想recursion地做这个,你可以使用GNU查找和-regextesting和posix-egrep。 但考虑到这个正则expression式将匹配相对于您search的目录的完整path名。

如果你有支持,另一个不错的select是扩展globs,见丹尼斯的答案。

ls | egrep -v (.tab|.o$|.bin$)

应该这样做。 egrep基本上是grep -E,它支持'扩展'的正则expression式,所以像(x | y)这样的东西的作品。

-v / --invert-match选项使grep输出行匹配。 所以:

 ls | grep -v .tab. 

要么

 ls | grep --invert-match .tab. 

在你的情况。

 shopt -s extglob ls -l !(*.bin|*.o|*~|*.tab.*)