2010-09-21 23 views
58
% cat temp 
$$$ hello1 
$$ hello2 
    hello3 
## hello4 
    hello5 $$$ 
% cat temp | grep "$$$" 
Illegal variable name. 
% cat temp | grep "\$\$\$" 
Variable name must contain alphanumeric characters. 
% 

Quiero grep para $$$ y espero que el resultado sea

% cat temp | grep <what should go here?> 
$$$ hello1 
    hello5 $$$ 
% 

Diferenciar, he marcado el símbolo como %.

  • ¿Cuál es el problema aquí?
  • ¿Cuál debería ser el grep string?
+2

Su segundo comando es correcto (con $ escapado), pero debe usar comillas simples, no comillas dobles. –

Respuesta

77

El problema es que el shell expande los nombres de las variables dentro de las comillas dobles. Por lo tanto, para "$$$", intenta leer un nombre de variable que comience con el primer $.

En comillas simples, por otro lado, las variables no se expanden. Por lo tanto, '$$$'sería trabajo - si no fuera por el hecho de que $ es un carácter especial en expresiones regulares que denotan el final de línea. Entonces necesita ser escapado: '\$\$\$'.

0

¿Qué tal ^.*[$]{3}.*$

+1

¿Por qué el ^. * Y el. * $? Parecen completamente inútiles ... –

20

Al utilizar comillas dobles " o ninguno utiliza doble \: "\\\$\\\$\\\$"

cat t | grep \\\$\\\$\\\$ 

si utiliza comillas simples ' puede usar:

cat t | grep '\$\$\$' 
7
$ grep '\$\$\$' temp 
$$$ hello1 
hello5 $$$ 

Hay un 'gato' superfluo en su comando.