2008-09-18 16 views
30

¿Cómo adaptar una comilla simple en sed si la expresión está encerrada entre comillas simples:Cómo hacer coincidir una comilla simple en sed

sed -e '...' 

Por ejemplo que coincidir con este texto:

'foo' 
+0

la etiqueta [sed] es más o menos incorrecta, ya que la pregunta podría ser acerca de, por ejemplo awk sin ningún cambio en el contenido. Debería ser 'shell', pero no puedo volver a etiquetar. – tzot

+1

@TimB: shell-quoting es una etiqueta completamente nueva, y redundante, ya que "shell", "escaping" son más que suficientes. "Escapar" se ha utilizado durante décadas (cerca de 40 años) cuando se despoja a los personajes de su significado especial en el caparazón ... y la pregunta era sobre cómo evitar una cita. – tzot

Respuesta

43

También se puede usar:

"texta'textb" (APOSTROPHE inside QUOTATION MARKs) 

o

'texta'\''textb' (APOSTROPHE text APOSTROPHE, then REVERSE SOLIDUS, APOSTROPHE, then APOSTROPHE more text APOSTROPHE) 

Utilicé nombres de caracteres Unicode. REVERSE SOLIDUS es más comúnmente conocido como backslash.

En este último caso, cierra su apóstrofo, luego invierte su apóstrofo con una barra diagonal inversa y luego abre otro apóstrofo para el resto del texto.

+6

El segundo caso es lo que estaba buscando. Gracias. – grigy

34

Como se señala en los comentarios a la pregunta, no se trata realmente de sed, sino de cómo incluir una comilla en una cadena entre comillas (por ejemplo, bash).

Para aclarar una respuesta anterior, debe evitar la comilla con una barra diagonal inversa, pero no puede hacer eso dentro de una expresión entre comillas simples. Desde la página de manual de bash:

personajes que encierran entre comillas simples preserva el valor literal de cada carácter dentro de las comillas. No se puede producir una sola cita entre las citas simples , incluso cuando está precedida por una barra diagonal inversa .

Por lo tanto, debe finalizar la expresión entrecomillada, insertar la comilla escapada y comenzar una nueva expresión entrecomillada. La eliminación de comillas del shell no agrega ningún espacio adicional, por lo que en efecto se obtiene la concatenación de cadenas.

lo tanto, para responder a la pregunta original de cómo comilla la expresión 'foo', que haría algo como esto:

sed -e '...'\''foo'\''...' 

(donde '...' es el resto de la expresión sed)

En general, en aras de facilitar la lectura, que sería mucho mejor cambiar las comillas que rodean a las comillas dobles si es posible:

sed -e "...'foo'..." 

[A modo de ejemplo del potencial pesadilla para el mantenimiento de la primera (comillas simples), observe cómo el resaltado de sintaxis de StackOverflow da color a las comillas, barras diagonales inversas y otro texto - definitivamente no es correcto.]

Cuestiones relacionadas