¿Por qué sed no reemplaza todas las ocurrencias?


118

Si ejecuto este código en bash:

echo dog dog dos | sed -r 's:dog:log:'

da salida:

log dog dos

¿Cómo puedo hacer que reemplace todas las apariciones de perro?


2
Necesita la gbandera para la sustitución global, tampoco necesita la -ropción aquí.
Chris Seymour

Respuestas:


188

Debe agregar el gmodificador para que sed realice una sustitución global del contenido del búfer de patrón:

echo dog dog dos | sed -e 's:dog:log:g'

Para obtener una documentación fantástica sobre sed, consulte http://www.grymoire.com/Unix/Sed.html . Esta bandera global se explica aquí: http://www.grymoire.com/Unix/Sed.html#uh-6

La documentación oficial de GNU sedestá disponible en http://www.gnu.org/software/sed/manual/


1
Agregar un caso de esquina para GNU sed aquí: sed -E 's,foo,bar,g'no hace lo global. Si lo cambia sed -E -e 's,foo,bar,g', funciona.
Melvyn Sopacua

23

Tienes que poner un gal final, significa "global":

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^

1
sed -e debe usarse en lugar de sed -r, que no existe.
Dylan Daniels

1
@DylanDaniels Según man sedUbuntu, la -ropción significa "usar expresiones regulares extendidas". Entonces, el comando dado funciona bien, aunque no necesita las características de las expresiones regulares extendidas para funcionar.
Craig McQueen
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.