es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , ,

Answer

  1. Avatar for 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:

    sed -r 's/^([^.]*)\.([^.]*)\.([^.]*)\.(.*)$/\1.\2 \3.\4/' \
    | sed -r 's/(^|\s)([a-zA-Z])[a-zA-Z]*|\s([a-zA-Z])[a-zA-Z]*(\s|$)/\1\2\3/g' \
    | sed -r 's/\s/\./g'
    

    Explicación:

    • El primer comando 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.
    • El segundo comando 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.
    • El tercer comando 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.

Comments are closed.