我shopt -s globstar extglob在我的./bashrc. 我正在搜索Foo在以下命令中引用字符串的文件:
grep -Fwn Foo /**/src/**/*.@(h|cpp)
Run Code Online (Sandbox Code Playgroud)
现在我想从文件Foo.h和Foo.cpp. 以下是获得此目标的命令
grep -Fwn Foo /**/src/**/*.@(h|cpp) | grep -v Foo.h | grep -v Foo.cpp
Run Code Online (Sandbox Code Playgroud)
我想在没有管道命令的情况下使用!和&位置模式来制作它。我的意思是像下面这样
grep -Fwn Foo /**/src/**/@(*.@(h|cpp)&(!(Foo.*)))
Run Code Online (Sandbox Code Playgroud)
为什么上面的命令不起作用以及如何修复它?
原因很简单,作为一个没有这样的事情&(...)在操作bash。bash仅ksh使用extglob. 在这里你想要:
grep -Fwn Foo /**/src/**/!(Foo).@(h|cpp)
Run Code Online (Sandbox Code Playgroud)
使用ksh93,您可以这样使用&:
grep -Fwn Foo /**/src/@(*.@(h|cpp)&!(Foo*))
Run Code Online (Sandbox Code Playgroud)
zsh有一个 and-not 运算符extendedglob:
grep -Fwn Foo /**/src/(*.(h|cpp)~Foo*)
Run Code Online (Sandbox Code Playgroud)