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:
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 \''
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
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á.
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ó.
Respuestas:
sed
Códigos de cotización con comillas dobles:No me gusta escapar de los códigos con cientos de barras invertidas; me duelen los ojos. Normalmente lo hago de esta manera:
fuente
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'
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!
fuente
sed 's/ones/two''s/' <<< 'ones thing'
No, eso saletwos 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:
fuente
$'string'
es específico de Bash, por lo que no es portátil para el shell POSIX.bash
específico. También está disponible enksh
yzsh
, 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.
También funciona con archivos.
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.
fuente
Esto es un poco absurdo, pero no pude conseguir
\'
ensed 's/ones/one\'s/'
el trabajo. Estaba buscando esto para hacer un script de shell que se agregará automáticamenteimport 'hammerjs';
a misrc/main.ts
archivo con Angular.Lo que sí me puse a trabajar es esto:
Entonces, para el ejemplo anterior, sería:
No tengo idea de por
\'
qué no funcionaría por sí solo, pero ahí está.fuente
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ó.fuente
Algunos escapes en terminales AppleMacOSX fallan, por lo que:
sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'
fuente
use un separador de cadenas alternativo como ":" para evitar confusiones con diferentes barras
o si desea resaltar la comilla simple
ambos regresan
fuente