Como combinar uma string contendo o caractere “$” com grep?

5

Como combinar strings que contêm $ character?

Exemplo - pelo seguinte grep não retorna a correspondência.

  param="ambari_parameter$"
  echo "ambari_parameter$" | grep $param
  echo "ambari_parameter$" | grep "$param"
    
por yael 21.08.2017 / 14:13

3 respostas

11

Nesse caso, a string em $param será interpretada como uma expressão regular. Essa expressão contém um $ que ancora o ambari_parameter no padrão ao final da correspondência. Como ambari_parameter$ nos dados de entrada não contém ambari_parameter no final, ele não corresponderá.

Você pode escolher combinar com uma string fixa em vez de uma expressão regular , usando -F :

echo 'ambari_parameter$' | grep -F -e "$param"

Eu também usei -e aqui para forçar o grep a reconhecer o seguinte argumento como um padrão. Isso é necessário se $param começar com um traço ( - ).

Para exigir ainda mais que a linha de entrada inteira corresponda à string completa, adicione -x :

echo 'ambari_parameter$' | grep -xF -e "$param"

Se $param for ambari_parameter$ , isso não corresponderá à string _ambari_parameter$ (que corresponderá se -x for omitida).

    
por 21.08.2017 / 14:16
8

Se você tem um padrão inteiro que deseja corresponder literalmente , não o use como uma expressão regular . Se você fizer precisar corresponder um literal $ em uma expressão regular, use \$ .

Como . , \ e vários outros caracteres de pontuação, $ é um metacaracteres em expressões regulares. O caractere $ corresponde à string vazia no final de uma linha (então x$ corresponde a x mas apenas no final de uma linha). Se o seu padrão não contiver metacaracteres any , você não precisará tratá-lo como uma expressão regular e deverá usar grep -F como Kusalananda explica .

Se você realmente precisa corresponder um $ ou qualquer outro metacaractere literalmente em uma expressão regular, escape com o caractere \ . Para corresponder a um literal $ write \$ , para corresponder a um literal \ write \ e assim por diante.

param='ambari_parameter\$'
echo "ambari_parameter$" | grep "$param"

Quando você atribui a param no shell, coloque a expressão regular entre aspas simples ( ' ' ) como mostrado acima, porque $ e \ também têm significados especiais na maioria dos shells, incluindo todos os shells estilo Bourne (você marcou ). \ em shells funciona basicamente da mesma forma que em expressões regulares. ( $ não; ele é usado para várias expansões / substituições de shell , especialmente expansão de parâmetros ).

Sem aspas, ou mesmo nas aspas duplas , \$ indica um literal $ no shell, que é então passado para grep como $ , que grep interpreta como um metacaractere de expressão regular. Colocá-lo entre aspas simples evita isso. Você poderia, alternativamente, escrever \\$ - ou às vezes apenas \$ - mas isso é confuso.

    
por 21.08.2017 / 14:34
2

Você deve escapar dos caracteres especiais caso esteja procurando uma correspondência exata deles desta forma:

se estiver entre aspas simples, é necessário um escape.

grep 'parameter\$'

se estiver entre aspas duplas ou não estiver entre aspas, será necessário um escape a mais.

grep "parameter\$" #or
grep parameter\$

Observe que qualquer espaço dentro da correspondência, se não for cotado, também deve ser evitado.

grep para\ meter\$
    
por 21.08.2017 / 14:34