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

Nishant George Agrwal
fuente
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/

Bruno Reis
fuente
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'
                                     ^
alestanis
fuente
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