¿Cuál es el uso del patrón antes del comando sustituto en sed?

¿Cuál es el uso del patrón antes del comando sustituto en sed?

Hay un ejemplo en esto.enlaceacerca de sed:

Para eliminar el primer número en todas las líneas que comienzan con "#", utilice:

sed '/^#/ s/[0-9][0-9]*//'

¿Cuál es el beneficio del primer patrón ( /^#/)? Podría ser simplemente:

sed 's/^#[0-9][0-9]*//'

Respuesta1

El formato general de sedlos comandos es

[address[,address]] function

Cuando un comando tiene una única dirección, opera en todas las líneas que coinciden con esa dirección. Cuando un comando no tiene dirección, opera en cada línea.

Referencia:POSIXsed


En cuanto a sus ejemplos específicos:

  • /^#/ s/[0-9][0-9]*//

    • Este comando tiene una dirección, /^#/que coincide con todas las líneas que comienzan con #.

    • El patrón de sustitución es /[0-9][0-9]*/. Esto coincide con la primera secuencia de dígitos dondequiera que aparezca en la línea.

    • Resumen en inglés sencillo: elimina la primera secuencia de dígitos en cada línea que comienza con #.

    • Ejemplo: # non-digits|5555|non-digits|5555se convierte# non-digits||non-digits|5555

  • s/^#[0-9][0-9]*//

    • No hay dirección, por lo que este comando opera en cada línea.

    • El patrón de sustitución, /^#[0-9][0-9]*/coincide con una secuencia de dígitos consecutivos precedidos por un# ancladoal principio de la línea.

    • Resumen en inglés sencillo: eliminar #seguido de una secuencia de dígitos (y solo ese patrón) desde el principio de cada línea.

    • Ejemplo: #5555|non-digits|5555se convierte en |non-digits|5555, pero # non-digits|5555|non-digits|5555no cambia porque el patrón de sustitución no coincide.

Respuesta2

El primero igualará y sustituirá:

#abc99

El segundo no lo hará.

Además, el segundo también eliminará el inicial #.

información relacionada