grepping com “shopt -s globstar extglob”

4

Eu tenho shopt -s globstar extglob no meu ./bashrc . Estou procurando arquivos que se referem à string Foo no seguinte comando:

grep -Fwn Foo /**/src/**/*.@(h|cpp)

Agora, quero excluir todos os arquivos Foo.h e Foo.cpp . O seguinte é o comando que obtém esse objetivo

grep -Fwn Foo /**/src/**/*.@(h|cpp) | grep -v Foo.h | grep -v Foo.cpp

Gostaria de fazer isso sem o comando de tubulação usando ! e & no padrão de localização. Quero dizer algo como o seguinte

grep -Fwn Foo /**/src/**/@(*.@(h|cpp)&(!(Foo.*)))

Por que o comando acima não funciona e como consertá-lo?

    
por Loom 19.03.2014 / 12:21

1 resposta

5

Simplesmente porque não existe um operador &(...) em bash . bash implementa apenas um subconjunto de ksh padrões com extglob . Aqui você quer:

grep -Fwn Foo /**/src/**/!(Foo).@(h|cpp)

Com ksh93 , você pode usar & desta maneira:

grep -Fwn Foo /**/src/@(*.@(h|cpp)&!(Foo*))

zsh tem um operador e não com extendedglob :

grep -Fwn Foo /**/src/(*.(h|cpp)~Foo*)
    
por 19.03.2014 / 12:37