¿Cómo está interpretando \ $ grep?


12

Cuando yo escribo

$ grep \$  

entonces cualquier cosa que escriba en la terminal, se corresponde e imprime en la terminal. ¿Cómo se \$interpreta?

Respuestas:


18

El shell está interpretando \$y pasando a grep como $el carácter de final de línea. Asumiendo que su línea tiene un final, coincidirá :-)

Si desea hacer coincidir un real $en grep, use uno de:

grep \\\$
grep '\$'

En el primero, el shell interpreta \\como \y \$como $, dando \$. En el último, no lo interpreta en absoluto.


En cuanto a su pregunta de por qué \$coincide con el signo de dólar en lugar de la secuencia de dos caracteres, las expresiones regulares como las utilizadas en el grepuso de caracteres especiales para algunos propósitos. Algunos de esos son:

$       end of line
^       start of line
.       any character
+       1 or more of the preceeding pattern
*       0 or more of the preceeding pattern
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

junto con muchos otros.

Cuando desee hacer coincidir un personaje de literla que normalmente se trata como un personaje especial, debe escapar de él para que greplo trate como el personaje normal.


1
para probar lo que ve grep, intente echo \$y luegoecho \\$

En grep \\\ $, como dijiste, \ $ se pasa a grep para que coincida con las cadenas que contienen \ $, pero ¿por qué coincide con las cadenas que solo contienen un $?

Porque $ en grep significa un final de línea. Para que coincida con el carácter $, debes escapar para que grep no lo trate especialmente. Mira mi actualización.

@Pasi: echo hace su propio escapado, dependiendo de si es un shell integrado o no, compatible con POSIX o no, etc. Es mejor usar (IMHO) ls \$y ver que obtenemos "ls: $: No existe tal archivo o directorio", para ver que \ $ no está escapado a $ pero \\ $ no está escapado a \ $, y así sucesivamente.
Henno

5

El shell primero expande cualquier secuencia de escape antes de pasar los argumentos al programa, por lo que interpreta la \$secuencia de escape y pasa el argumento único $a grep, que coincide con el final de la línea. Como cada línea tiene un final, cualquier línea debe coincidir :)


¿Pero cómo $ es el final de la línea? ¿No es el final de la línea \ n?

2
@Happy Mithal: Ver man grep; se ha decidido que $coincide con el final de la línea, independientemente de si las líneas están separadas por \n, o por \rambos, o por algo completamente diferente. En el caso general, las expresiones regulares se pueden usar para hacer coincidir cualquier cadena, no solo una "línea", y $se usa para hacer coincidir el final de la cadena.

2

Se está interpretando como el metacarácter de fin de línea. Si desea hacer coincidir un signo de dólar real, haga

 $ grep \\$ 

o

 $ grep '\$' 

1

^es para el inicio de la cadena y $para el final.

grep \$

o

grep $

coincidirá con cada cadena, por lo que todo lo que escriba se repite.

Tratar

grep a$

Ahora, solo las cadenas cuyo último carácter es se aunirán y harán eco .


1

Puede evitar la molestia de escapar si desea buscar un literal $, utilizando la expresión regular para la clase de caracteres. Por ejemplo,

$ grep '[$]' file
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.