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