Cómo escapar de una sola cita en sed?


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

Por ejemplo:

sed 's/ones/one's/' <<< 'ones thing'
Author: Benjamin W., 2014-07-01

6 answers

Quote sed códigos con comillas dobles:

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

No me gusta escapar códigos con cientos de barras invertidas – me duele los ojos. Normalmente lo hago de esta manera:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing
 85
Author: Kent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-25 00:34:28

Un truco es usar la concatenación de cadenas de shell de cadenas adyacentes y escapar de la cita incrustada usando shell escaping:

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

two's thing

Hay 3 cuerdas en la expresión sed, que la concha luego une:

sed 's/ones/two'

\'

's/'

¡Espero que eso ayude a alguien más!

 21
Author: Thomas Bratt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-01 13:43:34

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

Eg:

sed $'s/ones/two\'s/' <<< 'ones thing'
 5
Author: John C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-01 12:08:20

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 dobles simples y dentro de la cadena, eso 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
 2
Author: Stefanie Forrester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-17 21:08:30

Sé que esto va a sonar como un cop, pero nunca pude conseguir sed trabajando 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 índice.archivos hmtl. Las cadenas tenían comillas simples y dobles, así que simplemente dividí la cadena y reemplazé el primer bloque con <!-- y el segundo bloque con -->. Arruinó mi índice.archivos html pero funcionó.

 0
Author: mcmacerson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-28 13:33:39

Esto es un poco absurdo, pero no pude conseguir \' en sed 's/ones/one\'s/' para trabajar. Estaba buscando esto para hacer un script de shell que agregará automáticamente import 'hammerjs'; a mi archivo src/main.ts con Angular.

Lo que hice para trabajar es esto:

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts

Así que 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
Author: Amanda Greenberry Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 17:42:54