¿Cómo escapar de las comillas simples en sed?


Respuestas:


150

sedCó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

7
Esto no parece funcionar sed -i, ¿alguna razón en particular?
SamAko

Cabe señalar que rodear los comandos sed con comillas dobles permite que esos comandos sean interpolados por el shell y pueden provocar problemas imprevistos.
Potong

38

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!


quizás una variante más fácil: sed 's / ones / two''s /' <<< 'ones thing'
Gregory

@gregory: 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.
wisbucky

@wisbucky Con la versión de sed que estoy usando (FreeBSD / macOS) en zsh, definitivamente genera "dos cosas".
gregory

gran ayuda al hombre haciéndome saber, la cáscara luego cose.
Prateek Gupta

6

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

p.ej:

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

3
El estilo C $'string'es específico de Bash, por lo que no es portátil para el shell POSIX.
tripleee

No es bashespecífico. También está disponible en kshy 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.
dannyw

6

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

¡Gracias! Amo las expresiones regulares, amo sed y ahora te amo <3
Gabriel A. Zorrilla

3

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.tsarchivo 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á.



0

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ó.


0

Algunos escapes en terminales AppleMacOSX fallan, por lo que:

sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'


0

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.