Por que o grep não retorna o que eu espero quando uso aspas simples?

0

Eu tenho um arquivo com o conteúdo abaixo:

sh-4.2$ cat file1
example of multiple
pattern
this is an
example of multipole
sorry multiple
pattern matching
using grep
so the example is the
file itself
-example
-multiple
-bye
tata
!

Enquanto procura por "-example" no arquivo acima, o comando grep não está fornecendo a saída desejada. Eu sei que se o padrão contiver '-' então a opção -e deve ser usada:

No primeiro exemplo, usei -exemplo diretamente sem aspas:

sh-4.2$ grep -example file1
example of multiple
example of multipole
so the example is the
-example

-exemplo com aspas simples:

sh-4.2$ grep '-example' file1
example of multiple
example of multipole
so the example is the
-example

-exemplo com aspas duplas e caracteres de escape

sh-4.2$ grep "\-example" file1
-example
sh-4.2$
    
por Pankaj Pandey 17.12.2016 / 09:27

3 respostas

3

Bem, você sabe que o padrão de pesquisa contém um '-' e você sabe que, quando o padrão de pesquisa contiver um '-', será necessário usar o sinalizador -e . Como você não está usando o sinal -e , o shell está interpretando seu "padrão" como um argumento (e um parâmetro). Você pode ver isso com:

$ grep "-foo" file1
grep: oo: No such file or directory

Por extensão, seu código grep "-example" file1 está dizendo ao shell que você deseja executar grep com o argumento -e e um parâmetro "xample".

Este é o mesmo problema que encontramos quando tentamos algo como rm -my-silly-file-name - não funciona, e precisamos usar algo como rm ./-my-silly-file-name . Outra solução alternativa seria rm -- -my-silly-file-name . Podemos usar esse idioma aqui:

$ grep -- "-example" < file1
-example

O "-" diz ao shell que tudo depois dele não é um argumento.

Alternativamente, você pode simplesmente escapar do "-" com um "\", como você viu:

grep "\-example" file1

Este artigo vai em alguns detalhes sobre a citação : a parte relevante é Parâmetros e comandos backquoted que devem ser interpretados pelo shell são colocados entre aspas duplas. Quando você usa aspas duplas, o conteúdo é interpretado por o shell.

    
por 17.12.2016 / 11:51
2

Você "sabe se o padrão [começa com] '-" então a opção -e deve ser usada ", mas você não está usando quando deveria. grep -e -example file1 vai te dar o resultado esperado.

Aqui está o que é realmente executado em cada um dos seus exemplos:

  • grep -example file1 = > grep -e xample file1 (-e é necessário)
  • grep '-example' file1 = > grep -e xample file1 (-e é necessário)
  • grep "\-example" file1 = > grep \-example file1 (-e não é necessário)
por 17.12.2016 / 11:11
2

Um argumento que começa com - é considerado uma opção.

Nos dois primeiros casos, o primeiro argumento passou para grep é -example , que grep entende como -e xample ( xample argumento para a opção -e , portanto, pesquise xample ) .

No terceiro caso \-example é passado para grep . Como não começa com - , não é considerado uma opção. É tomado como um regexp em vez disso. No entanto, o comportamento de \- não é especificado de acordo com POSIX, portanto, você não tem garantia sobre o que corresponde. Com a maioria das grep implementações, \- corresponderá a - , mas você pode imaginar grep implementações em que \- pode ser um operador especial (veja por exemplo GNU grep onde \+ é um operador especial e não corresponde a um literal + ).

Se você quiser que -example não seja usado como opção, você precisa:

  • %código%. O grep -- -example file marca o final das opções. Qualquer coisa depois é uma não-opção (então o primeiro argumento o padrão para procurar e o resto a lista de arquivos para procurar).
  • %código%. Aqui, -- é considerado o argumento para a opção grep -e -example file .

Esse é o tipo de razão pela qual você deve se acostumar a escrever:

grep -e "$pattern" file

Ou

grep -- "$pattern" file

se você não pode garantir que -example não comece com -e .

Note que aqui você também pode escrever:

grep '[-]example' file

No entanto, consulte Expressão de suporte (sem intervalos) que combina caracteres inesperados no bash sobre possíveis complicações com essa abordagem.

    
por 17.12.2016 / 11:51