Cuando yo escribo
$ grep \$
entonces cualquier cosa que escriba en la terminal, se corresponde e imprime en la terminal. ¿Cómo se \$
interpreta?
Cuando yo escribo
$ grep \$
entonces cualquier cosa que escriba en la terminal, se corresponde e imprime en la terminal. ¿Cómo se \$
interpreta?
Respuestas:
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 grep
uso 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 grep
lo trate como el personaje normal.
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.
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 :)
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 \r
ambos, 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.
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 '\$'
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
echo \$
y luegoecho \\$