¿Cómo escapar de comillas simples en sed?

¿Cómo escapar una cita simple en una expresión sed que ya está rodeada por comillas?

Por ejemplo:

sed 's/ones/one's/' <<< 'ones thing' 

Cita códigos sed 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 diagonales, me duele la vista. Usualmente lo hago de esta manera:

  $ sed 's/ones/one\x27s/'< <<"ones thing" one's thing 

Un truco es usar 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 el shell luego une:

sed 's/ones/two'

\'

's/'

Espero que ayude a alguien más!

La mejor forma es usar $'some string with \' quotes \''

p.ej:

 sed $'s/ones/two\'s/' < << 'ones thing' 

Simplemente use comillas dobles en el exterior del comando sed.

 $ sed "s/ones/one's/" < << 'ones thing' one's thing 

Funciona con archivos también.

 $ echo 'ones thing' > testfile $ sed -i "s/ones/one's/" testfile $ cat testfile one's thing 

Si tiene comillas simples o dobles dentro de la cadena, también está bien. Solo 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 

Sé que esto va a sonar como una salida de policía, pero nunca podría funcionar Sed cuando había comillas simples y dobles en la cadena. Para ayudar a los novatos como yo que están 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 separé la cadena y reemplacé el primer bloque con . Hizo un lío de mis archivos index.html pero funcionó.