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'
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
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!
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'
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
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ó.
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á.
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