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.

sed dividir subcadena que puede o no estar presente

Tratando de dividir la columna de texto basada en el texto que puede o no estar presente.

archivo de muestra:

TEXTO1D1NEWBWP210HTEXTO2
TEXTO1D1BWP210HTEXTO2

salida esperada:

TEXTO1D1NEWBWP210HTEXTO2 NEWBWP 210H
TEXTO1D1BWP210HTEXTO2 BWP 210H

comando utilizado — Esperando que “\?” verifique si la subcadena “NEW” está presente e imprima en caso de estar allí.

cat | sed ‘s/.(\s)(NEW)\?(BWP)([0-9]+)H.*/\0 \2\3 \4H/’

La salida del comando anterior es

TEXTO1D1NEWBWP210HTEXTO2 BWP 210H
TEXTO1D1BWP210HTEXTO2 BWP 210H

No estoy seguro de qué estoy haciendo mal aquí… 🙂

Tags:  

Answer

  1. Avatar for davy.ai

    El problema aquí es con la expresión regular utilizada en el comando sed.

    Veámoslo detalladamente:

    • .*(\s*): coincidir con cualquier carácter hasta un carácter de espacio en blanco (opcional).
    • (NEW)?: coincidir con la cadena “NEW” (opcional).
    • (BWP): coincidir con la cadena “BWP”.
    • ([0-9]+)H: coincidir con uno o más dígitos seguidos de “H”.
    • .*: coincidir con cualquier caracter restante.

    El problema con esta expresión regular es que coincide con cualquier caracter restante después de BWP y los dígitos, por lo que no diferencia entre la presencia o ausencia de “NEW”. Necesitamos modificar la expresión regular para que coincida solo con los caracteres restantes si “NEW” no está presente. Podemos hacer esto usando una afirmación de negación hacia adelante:

    cat <text_file> | sed -e 's/\(.*\)\(NEW\)\?\(BWP\)\([0-9]\+\)H\(\(.*\)\|\)/\1 \2\3 \4H \6/g'
    

    Desglosemos la expresión regular modificada:

    • \(.*\): coincidir con cualquier carácter hasta el final de la cadena.
    • \(NEW\)\?: coincidir con la cadena “NEW” (opcional).
    • \(BWP\)\([0-9]\+\)H: coincidir con la cadena “BWP” seguida de uno o más dígitos y “H”.
    • \(\(.*\)\|\): coincidir con cualquier caracter restante (si “NEW” no está presente) o nada (si “NEW” está presente).

    Con esta modificación, el comando sed debería producir la salida esperada:

    TEXT1D1NEWBWP210HTEXT2 NEWBWP 210H
    TEXT1D1BWP210HTEXT2 BWP 210H

Comments are closed.