我知道一些正则表达式,但我不知道如何让它工作。我想列出所有没有 .tab 的文件。文件名末尾没有 ~ 并且不是 .o(或 .bin)
我可以列出所有带有 .tab 的文件,方法是:
ls | grep .tab.
但是我不知道如何让它忽略这些文件并列出其他文件。我试过了
ls | grep [^(.tab.)]
但出现了错误,我以为我的最终正则表达式应该是
ls | grep ([^(.tab.)]|.o$|.bin$)
但是我从来没有做过太多的正则表达式,所以我确信即使语法正确,最终的结果也是错误的。
答案1
我如何执行此操作取决于上下文。如果这不是脚本,而我只是想看看这个,我可以使用 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
如果您只想要常规文件而不是目录,则可以添加另一个带有 -f 的 if 测试。如果您想以递归方式执行此操作,可以使用带有 -regex 测试和 posix-egrep 的 GNU find。但请考虑到此正则表达式将匹配相对于您搜索的目录的完整路径名。
另一个不错的选择是扩展 glob(如果您有支持的话),请参阅 Dennis 的回答。
答案2
-v
/选项--invert-match
使 grep 输出以下行:不是匹配。所以:
ls | grep -v .tab.
或者
ls | grep --invert-match .tab.
就你的情况而言。
答案3
shopt -s extglob
ls -l !(*.bin|*.o|*~|*.tab.*)
答案4
ls | egrep -v (.tab|.o$|.bin$)
应该可以。egrep 基本上是 grep -E,它支持“扩展”正则表达式,因此像 (x|y) 这样的功能可以工作。