Mi sospecha es que no puedes hacerlo en sed
estándar , pero podría hacerlo con Perl u otra cosa con un manejo de expresiones regulares más potente.
$ echo "She sells sea shells by the sea shore" |
> perl -pe 's/(sh[a-z]*)/"." x length($1)/gei'
... sells sea ...... by the sea .....
$
El e
modificador significa que el patrón de reemplazo es un script Perl ejecutable; en este caso repite el caracter .
tantas veces como caracteres haya en el patrón coincidente. El g
el modificador se repite a lo largo de la línea; el i
El modificador es para coincidencias que no distinguen entre mayúsculas y minúsculas. Los -p
opción de Perl imprime cada línea después del procesamiento en el script especificado por el -e
option — el comando sustituto.
¿Este awk-oneliner hace el trabajo por ti?
awk '{for(i=1;i<=NF;i++)if($i~/^[Ss]h/)gsub(/./,".",$i)}1' file
prueba con tus datos:
kent$ echo "She sells sea shells by the sea shore"|awk '{for(i=1;i<=NF;i++)if($i~/^[Ss]h/)gsub(/./,".",$i)}1'
... sells sea ...... by the sea .....
Una vieja pregunta, pero encontré una solución sed agradable y relativamente corta de una línea:
sed ':a;s/\([Ss]h\.*\)[^\. ]/\1./;ta;s/[Ss]h/../g'
Funciona reemplazando un carácter a la vez en un bucle.
:a;
iniciar un bucle
s/\([Ss]h\.*\)[^\. ]
busca un sh
seguido de cualquier número de .
s (nuestro trabajo completado hasta ahora) seguido de un carácter sin punto o espacio (lo que vamos a reemplazar)
/\1./;
reemplácelo por nuestro trabajo completado hasta ahora más otro .
.
ta;
si hicimos alguna sustitución, bucle, de lo contrario...
s/[Ss]h/../g
reemplaza el sh
s con dos .
s y llámalo un día.