¿Cómo escapar de una comilla simple en una expresión sed que ya está rodeada de comillas?
Por ejemplo:
sed 's/ones/one's/' <<< 'ones thing'
¿Cómo escapar de una comilla simple en una expresión sed que ya está rodeada de comillas?
Por ejemplo:
sed 's/ones/one's/' <<< 'ones thing'
Respuestas:
sed
Códigos de cotización con comillas dobles:
$ sed "s/ones/one's/"<<<"ones thing"
one's thing
No me gusta escapar de los códigos con cientos de barras invertidas; me duelen los ojos. Normalmente lo hago de esta manera:
$ sed 's/ones/one\x27s/'<<<"ones thing"
one's thing
sed -i
, ¿alguna razón en particular?
Un truco consiste en utilizar la concatenación de cadenas de shell de cadenas adyacentes y escapar de la cita incrustada utilizando el escape de shell:
sed 's/ones/two'\''s/' <<< 'ones thing'
two's thing
Hay 3 cadenas en la expresión sed, que luego el caparazón une:
sed 's/ones/two'
\'
's/'
¡Espero que ayude a alguien más!
sed 's/ones/two''s/' <<< 'ones thing'
No, eso sale twos thing
. Falta el '
en la salida. Tienes que hacerlo de la forma descrita en esta respuesta.
La mejor forma es utilizar $'some string with \' quotes \''
p.ej:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
es específico de Bash, por lo que no es portátil para el shell POSIX.
bash
específico. También está disponible en ksh
y zsh
, pero sí, es una extensión de POSIX, lo cual está bien si no está escribiendo un script portátil. El único inconveniente es que también debe escapar de cualquier otra barra invertida que use.
Simplemente use comillas dobles en el exterior del comando sed.
$ sed "s/ones/one's/" <<< 'ones thing'
one's thing
También funciona con archivos.
$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing
Si tiene comillas simples y dobles dentro de la cadena, también está bien. Simplemente escapa de las comillas dobles.
Por ejemplo, este archivo contiene una cadena con comillas simples y dobles. Usaré sed para agregar una comilla simple y eliminar algunas comillas dobles.
$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile
$ cat testfile
it's more than one's thing
Esto es un poco absurdo, pero no pude conseguir \'
en sed 's/ones/one\'s/'
el trabajo. Estaba buscando esto para hacer un script de shell que se agregará automáticamente import 'hammerjs';
a mi src/main.ts
archivo con Angular.
Lo que sí me puse a trabajar es esto:
apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts
Entonces, para el ejemplo anterior, sería:
apost=\'
sed 's/ones/one'$apost's/'
No tengo idea de por \'
qué no funcionaría por sí solo, pero ahí está.
Sé que esto va a sonar como una salida, pero nunca pude hacer funcionar sed cuando había comillas simples y dobles en la cadena. Para ayudar a cualquier novato como yo que esté teniendo problemas, una opción es dividir la cadena. Tuve que reemplazar el código en más de 100 archivos index.hmtl. Las cadenas tenían comillas simples y dobles, así que simplemente dividí la cadena y reemplacé el primer bloque con
<!--
y el segundo bloque con -->
. Hizo un desastre con mis archivos index.html pero funcionó.
use un separador de cadenas alternativo como ":" para evitar confusiones con diferentes barras
sed "s:ones:one's:" <<< 'ones thing'
o si desea resaltar la comilla simple
sed "s:ones:one\'s:" <<< 'ones thing'
ambos regresan
one's thing