¿Cuándo usar comillas simples, comillas dobles en grep?

20

Al intentar buscar un patrón simple "hola" en un archivo, todas las siguientes formas de grep funcionan:

  • grep hello file1
  • grep 'hola' archivo1
  • grep "hola" archivo1

¿Existe un caso específico en el que uno de los formularios anteriores funcione pero otros no? ¿Hay alguna diferencia si uso uno en lugar de otro?


fuente

Respuestas:

25

Esto realmente depende de su caparazón. Las citas (de cualquier tipo) están destinadas principalmente a tratar con espacios en blanco. Por ejemplo, lo siguiente:

grep hello world file1

buscará la palabra "hola" en los archivos llamados "mundo" y "archivo1", mientras

grep "hello world" file1

buscará "hola mundo" en el archivo1.

La elección entre comillas simples o dobles solo es importante si la cadena de búsqueda contiene variables u otros elementos que espera evaluar. Con comillas simples, la cadena se toma literalmente y no se realiza ninguna expansión. Con comillas dobles, las variables se expanden. Por ejemplo (con un shell derivado de Bourne como Bash o ZSH):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

El primero grepbuscará la cadena literal "$ VAR1" en el archivo1. El segundo expandirá la variable "$ VAR" y buscará la cadena "serverfault" en el archivo1.

James Sneeringer
fuente
La cuestión clave a tener en cuenta es que en la pregunta original, grep está recibiendo exactamente los mismos argumentos cada vez.
MikeyB
2
Ten cuidado ahí. $es el final de línea en una expresión regular, por lo $VAR1que nunca debería coincidir con nada. Resulta que funciona en GNU grep, pero todavía no contaría con ese comportamiento. Tendría que \$VAR1hacer coincidir con seguridad la cadena literal. (Y necesitaría barras diagonales adicionales si está entre comillas dobles)
Steven Pritchard
7

James tiene razón, pero para agregar más datos, creo que la mejor manera de pensarlo es como argumentos del comando: ¿pretendes que "hola" y "mundo" sean dos argumentos o que "hola mundo" sea uno argumento.

Además, las comillas dobles permiten interpretar más que solo variables. Exactamente lo que depende de su shell, pero verifique la expansión del historial, la expansión de llaves y la expansión del nombre de archivo.

También es importante tener en cuenta que hay algunos casos en los que necesita usar ambos tipos de comillas en un solo argumento. Recuerde que (por defecto) los argumentos están delimitados por espacios en blanco, por lo que si no deja ningún espacio, todavía está especificando el mismo argumento.

El mecanismo de comillas simples de la mayoría de los shells no permite ningún carácter especial, lo que significa que cualquier instancia de otra cita simple, incluso si parece haber escapado, finaliza la cita. Por lo tanto, es imposible pasar una cadena con una comilla simple dentro de una cadena de comillas simples, y debe usar comillas dobles. Esto puede ser una molestia cuando desea pasar un argumento que contiene comillas simples y algo que se interpretaría, pero no quiere serlo. Por ejemplo, si desea pasar la cadena literal "` '$ VAR' es una variable ", debe hacerlo de esta manera:

"'"'$VAR'"' is a variable"

Eso es en realidad una concatenación de tres cadenas entre comillas:

"'"
'$VAR'
"' is a variable"

o, con las comillas eliminadas:

'
$VAR
' is a variable

En realidad, con la mayoría de los proyectiles, también podría hacerlo de esta manera:

"'\$VAR' is a variable"

donde la barra diagonal inversa (" \") le dice al shell que acepte el siguiente carácter literalmente y que no realice ninguna expansión en él.

Pero hay algunos casos en los que terminas teniendo que hacerlo de la forma de concatenación de cadenas múltiples, no es que realmente pueda encontrar un ejemplo en este momento.

wfaulk
fuente