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.