¿Cómo puedo procesar posteriormente un grupo de captura mientras se preservan otros en sed?
Tengo una cadena con 3 grupos de captura y me gustaría preservar el primero y el tercero, pero realizar una sustitución en el segundo. ¿Cómo puedo expresar esto en sed?
Concretamente, tengo una cadena de entrada como:
top-level.subpath.one.subpath.two.subpath.forty-five
Y quiero preservar la parte antes del primer “.”, acortar la parte central a la primera letra de cada palabra y preservar la parte después del último “.”. El resultado debería verse así:
top-level.s.o.s.t.s.forty-five
Para preservar los grupos de captura, tengo:
sed -r ‘s/([^.])(.)(..*)/\1…\3/’
lo que me da:
top-level….forty-five
Para convertir algo como “.subpath.one.subpath.two.subpath” a solo iniciales, tengo:
sed -r ‘s/(.[^.])[^.]*/\1/g’
lo que me da:
.s.o.s.t.s
Me gustaría esencialmente aplicar esa segunda expresión sed al segundo grupo de captura. ¿Hay alguna manera de encadenar sustituciones de sed para realizar esa segunda sustitución solo en el segundo grupo de captura mientras se conservan el primero y el tercero?
davy.ai
Sí, puedes usar la función de agrupamiento de sed para capturar el segundo grupo y aplicar la sustitución sólo a ese grupo. Aquí te mostramos cómo puedes modificar el comando sed para lograr la salida deseada:
Explicación:
sed
captura los tres grupos como antes, pero reemplaza el segundo grupo con un espacio para que podamos aplicar la sustitución sólo a ese grupo. La salida de este comando serátop-level subpath.one subpath.two fort-five
.sed
utiliza regex para coincidir con cada palabra en el segundo grupo y reemplazarla con su primera letra. También maneja las palabras al principio o al final del grupo. La salida de este comando serás.o.s.t.s
.sed
reemplaza el espacio entre el primer y segundo grupos con un.
para unirlos de nuevo, y la salida de este comando serátop-level.s.o.s.t.s.forty-five
.Por lo tanto, encadenando estos tres reemplazos de sed te dará el resultado deseado.