Imprimir desde la primera instancia del texto A a la primera instancia del texto B

Imprimir desde la primera instancia del texto A a la primera instancia del texto B

Tengo el siguiente array dentro de un programa:

  ... #code
  $packages = [ 
    'git',        # version control
     ...
    'iftop',      # monitor network usage by ip
    'iotop',      # monitor io usage
  ]
  ... #more code

Quiero usar awkpara imprimir líneas desde la primera aparición de $packages hasta el primer final ], después de la aparición de $packages.

¿Cómo puedo hacer esto?

Respuesta1

Itere sobre los registros, mantenga un identificador para $packages, imprima líneas cuando el identificador esté configurado y salga después de imprimir cuando encuentre lo siguiente ]:

awk '/\$packages/ {c=1; print; next} /\]/ {print; exit}; c{print}'

Ejemplo:

% cat file.txt 
  ... #code
  $packages = [ 
    'git',        # version control
     ...
    'iftop',      # monitor network usage by ip
    'iotop',      # monitor io usage
  ]
  ... #more code

  ... #code
  $packages = [ 
    'git',        # version control
     ...
    'iftop',      # monitor network usage by ip
    'iotop',      # monitor io usage
  ]
  ... #more code

% awk '/\$packages/ {c=1; print; next} /\]/ {print; exit}; c{print}' file.txt   
  $packages = [ 
    'git',        # version control
     ...
    'iftop',      # monitor network usage by ip
    'iotop',      # monitor io usage
  ]

Respuesta2

Usamos el rangeoperador ,de sedpara seleccionar el rango de líneas que nos interesan. Para este escenario, el rango comienza con la cadena $packagey termina con ](en líneas diferentes).

Primero rechazamos cualquier línea fuera del rango, /\$package/,/]/!dy luego desde el rango las imprimimos todas (debido a la impresión implícita de la propiedad de espacio del patrón de sed) PERO quittan pronto como ]se encuentra la línea con la cadena. implica que hemos impreso en la salida estándar el primero de los rangos/\$package/,/]/

sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile

información relacionada