grep regex pattern causa comportamento de comando inesperado

3

Estou procurando por linhas com $ e consecutivamente ' ou " por meio desse grep no meu terminal:

grep "\$('|\")" -rin folder_path

Depois de pressionar Enter, o terminal não acha que a linha está completa, então acrescenta outra linha para eu continuar escrevendo. Se eu pressionar a tecla Tab enquanto escrevo folder_path , aparece este erro:

bash: command substitution: line 107: syntax error: file premature end
bash: command substitution: line 106: unexpected file premature end while searching for '''

Essas mensagens de erro foram traduzidas porque uma parte delas é mostrada em português. Estou usando o Ubuntu 13.10.

O que está errado?

    
por Edson Horacio Junior 19.05.2015 / 21:00

2 respostas

3

Use isto:

grep -rn "$\('\|\"\)" /path/to/directory

Seu problema é na verdade duplo:

  • Da perspectiva de grep , Você está usando as sintaxes Regex estendidas, ou seja, ( , | , ) sem escapar delas (para tratá-las como especiais) dentro do padrão Básico de Regex. Para superar isso, escape a todos para tratá-los como especiais ou use a opção -E de grep .

  • Outro problema causado pelo problema não escapando é que $() é o padrão de substituição do comando bash , pois você não escapou dos caracteres relevantes bash estava tratando o padrão $() como substituição de comando . Observe que o \$() torna o comando \ plus substituição de comando como primeiro \ fará o segundo \ literal e o restante padrão de substituição de comando será deixado como está.

Observe também que -i é desnecessário aqui, pois não estamos pesquisando caracteres alfabéticos. Você pode estar interessado em imprimir os nomes dos arquivos:

grep -Hrn "$\('\|\"\)" /path/to/directory

Outra coisa é que você pode escapar sem $ (indica o fim da linha) nesse caso, porque existem caracteres para corresponder depois de $ , como resultado grep irá tratar literalmente:

grep -Hrn "$\('\|\"\)" /path/to/directory
    
por heemayl 19.05.2015 / 21:54
1

Não faço idéia do que você está fazendo de errado, já que eu não sou tão bom com o grep, mas você deveria estar fazendo isso grep "$'\|$\"" , basicamente procure por $ 'ou $ ", e observe que todas essas expressões escaparam

Veja um exemplo:

    
por Sergiy Kolodyazhnyy 19.05.2015 / 21:38