Como posso procurar por uma string com uma barra invertida literal ao usar o grep?

1

Gostaria de pesquisar \G string, incluindo a barra invertida com grep .

$ echo "\G\G" > /tmp/test
$ grep '\G' /tmp/test 
\G\G
$ grep '\G' /tmp/test 
\G\G
$ grep "\G" /tmp/test 
\G\G
$ grep "\G" /tmp/test 
\G\G

Veja também a imagem abaixo para as partidas em vermelho:

Eu estava me perguntando por que apenas '\G' funciona? É por causa do bash apenas, ou por causa do bash e do grep? Obrigado.

    
por Tim 16.01.2018 / 03:45

2 respostas

5

Isso tem a ver com o que grep vê versus o que a shell vê. Então, ambos.

Se você quiser ver o que grep vê com várias formas de citar, use, por exemplo:

printf '<%s>\n' G "G" 'G' \G "\G" '\G' \G "\G" '\G'

Isso demonstrará o que o shell faz com os vários tipos de citações.

Se grep vir apenas um G , ele pesquisará (e destacará, com suas configurações) apenas as G correspondentes.

Se grep vir uma única barra invertida seguida por G , ela (na sua implementação e provavelmente em todas as implementações atuais) considerará que a barra invertida remove qualquer significado especial do caractere G . Mas não há nenhum significado especial para G , então o resultado será o mesmo que se você passasse G .

Se grep vir duas barras invertidas, a primeira remove o significado especial da segunda. Então, quando grep\G , ele procura por uma barra invertida literal seguida de G . Isso é o que você quer.

Se você usar o -F flag para grep , para procurar uma string fixa, poderá passar apenas \G e obter o mesmo resultado. (Ou seja, se você passar \G para que grep veja \G , o que exigirá que você escape da barra invertida de alguma forma, então o shell não t removê-lo.)

    
por 16.01.2018 / 03:56
1

No exemplo mencionado, você mencionou \G\G

\G == > será consisdered como \ G apenas. A barra volta fará com que seja tratada como uma string normal em vez de um significado especial no linux. Portanto, a primeira barra invertida fará com que a próxima sequência seja tratada como uma string normal. Então, a primeira barra invertida não será consisada

se você quiser \G como string normal, então você precisa mencionar como echo "\G\\G "

eu testei usando o exemplo abaixo

criou um arquivo mencionando o conteúdo abaixo

cat test.txt

\G
\G

Se eu quiser apenas grep \G i estará usando o comando abaixo

grep '^\G' test.txt

saída

\G

Se eu quiser apenas grep "\G" i estará usando o comando abaixo

grep '\\G' test.txt

saída

\G

Em vez disso, podemos fazer isso pelo comando sed

Para encontrar a linha que contém \ G usando o comando abaixo

sed -n '/^\G/p' test.txt

Para encontrar a linha que contém \G usando o comando abaixo

sed -n '/\\G/p' test.txt
    
por 16.01.2018 / 10:54

Tags