O que há de errado com este grep?

1
> output2.txt
cd # some directory i'm trying to search
find views/shared -type f -name "*.js" -print0 | while IFS= read -r -d $'
grep: brackets ([ ]) not balanced
' line; do echo -n "${line%.js}" | tee -a ~/Documents/counter/output2.txt grep -lr "${line%.js}" . | wc -l | tee -a ~/Documents/counter/output2.txt # produce a count of occurrences regex='[a-zA-Z]+.extend' grep -f $line $regex grep -lr "${line%.js}" . | tee -a ~/Documents/counter/output2.txt # produce a list of occurrences done

Retorna

> output2.txt
cd # some directory i'm trying to search
find views/shared -type f -name "*.js" -print0 | while IFS= read -r -d $'
grep: brackets ([ ]) not balanced
' line; do echo -n "${line%.js}" | tee -a ~/Documents/counter/output2.txt grep -lr "${line%.js}" . | wc -l | tee -a ~/Documents/counter/output2.txt # produce a count of occurrences regex='[a-zA-Z]+.extend' grep -f $line $regex grep -lr "${line%.js}" . | tee -a ~/Documents/counter/output2.txt # produce a list of occurrences done

Todos os exemplos que vi na web parecem indicar que não há nada de errado aqui, então estou bastante confuso

Certamente os colchetes estão equilibrados, não são?

    
por itsmichaelwang 12.08.2015 / 20:54

2 respostas

1

Seu problema é a opção -f . Em vez de especificar o arquivo a ser pesquisado, -f especifica um arquivo para ler uma lista de padrões. A página do manual do OS X grep explica isso, embora não seja muito claro :

 -f file, --file=file
         Read one or more newline separated patterns from file.  Empty pattern lines match every input
         line.  Newlines are not considered part of a pattern.  If file is empty, nothing is matched.

A ajuda para o GNU grep é realmente mais direta:

$ grep --help | grep -- '-f,'
  -f, --file=FILE           obtain PATTERN from FILE
$ 

Esse comportamento de -f é, de acordo com a página man do GNU grep, specified by POSIX.

Sua correção provavelmente mudará sua linha:

grep -f $line $regex

para:

egrep "$regex" -- "$line"
  • Você está usando uma expressão regular estendida, então use egrep ou grep -E
  • O -- impedirá que grep analise as opções na variável $line , por exemplo ele protegeria você contra um arquivo chamado " -r funnyname.js "
por 12.08.2015 / 21:34
0

Se a entrada do grep pipe contiver colchetes ('[' e ']'), o grep terá dificuldades em lidar com eles graciosamente. Você deve primeiro "limpar" a entrada usando algo assim para envolver cada colchete em um par de colchetes, fazendo com que eles sejam interpretados como caracteres literais a serem correspondidos:

CommandYouWantToPipeThroughGREP | sed -e 's^\([][]\)^\[\]^g' | grep ...

Explicação do comando sed:

sed -e : uma expressão segue o -e. Deve ser encapsulado em aspas simples ou duplas.

s^ : [s] procurar por. "^" está sendo usado como um delimitador de campo. Toda vez que você vê "^", está delimitando uma nova parte da opção de pesquisa.

\( ... \) e : parênteses com escape envolvem um padrão que você deseja acessar como uma variável em sed. O primeiro desses padrões é referido como "\ 1"; o segundo é "\ 2" e assim por diante.

[][] : Os dois colchetes externos estão envolvendo os dois internos. O primeiro caractere após um "[" é automaticamente assumido como literal (com escape / sem significado especial). Como esse primeiro caractere é um colchete, o próximo colchete também é considerado literal, a menos que seja o único colchete antes do final desse campo delimitado por "^". (Pelo menos, essa é minha compreensão de como isso funciona ...)

\[\] : Encadeia a variável sed 1 ("\ 1") em colchetes literais e envia-a para a saída.

g : [g] reedy. Significa "Localizar e substituir todos os exemplos do texto da pesquisa, em vez de apenas o primeiro".

Portanto, apenas canalize qualquer entrada que possa conter colchetes através deste comando sed antes de fazer pipp através do grep, e o grep irá procurar os colchetes literalmente, ao invés de interpretá-los como caracteres especiais. Infelizmente, parece que, se você enviar para OUTRO comando grep, após o primeiro, você precisará executá-lo através do sed, novamente, para recuperar os colchetes novamente.

    
por 02.11.2015 / 20:51