Ejemplo:
1:20 2:25 3:0.432 2:-17 10:12
Quiero reemplazar todas las cadenas que comienzan con 2:
a 2:0
.
Salida:
1:20 2:0 3:0.432 2:0 10:12
Respuesta aceptada:
Usando sed
:
sed -E 's/((^| )2:)[^ ]*/\10/g' in > out
Además, inspirado en la respuesta de souravc, si no posibilidad de un 2:
subcadena después del comienzo de una cadena no que contiene un 2:
inicial subcadena (por ejemplo, hay no posibilidad de un 1:202:25
cadena, que el siguiente comando abreviado reemplazaría a 1:202:0
), el comando podría acortarse a esto:
sed -E 's/2:[^ ]*/2:0/g' in > out
Desglose de los comandos n.° 1 y n.° 2 :
-E
:hacesed
interpretar el patrón como un patrón ERE (expresión regular extendida);> out
:redirigestdout
aout
;
sed
desglose del comando n.º 1 :
s
:afirma que realiza una sustitución/
:comienza el patrón(
:inicia el grupo de captura(
:comienza a agrupar las cadenas permitidas^
:coincide con el inicio de la línea|
:separa la segunda cadena permitida:coincide con un
personaje
)
:deja de agrupar las cadenas permitidas2
:coincide con un2
personaje:
:coincide con un:
personaje)
:detiene el grupo de captura[^ ]*
:coincide con cualquier número de caracteres que no sean/
:detiene el patrón / inicia la cadena de reemplazo\1
:referencia inversa reemplazada con el primer grupo de captura:añade un
personaje
/
:detiene la cadena de reemplazo / inicia las banderas de patróng
:afirma realizar la sustitución globalmente, es decir, sustituir cada aparición del patrón en la línea
sed
desglose del comando n.° 2 :
s
:afirma que realiza una sustitución/
:comienza el patrón2
:coincide con un2
personaje:
:coincide con un:
personaje[^ ]*
:coincide con cualquier número de caracteres que no sean/
:detiene el patrón / inicia la cadena de reemplazo2:0
:añade un2:0
cadena/
:detiene la cadena de reemplazo / inicia las banderas de patróng
:afirma realizar la sustitución globalmente, es decir, sustituir cada aparición del patrón en la línea