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 awk
para 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 range
operador ,
de sed
para seleccionar el rango de líneas que nos interesan. Para este escenario, el rango comienza con la cadena $package
y termina con ]
(en líneas diferentes).
Primero rechazamos cualquier línea fuera del rango, /\$package/,/]/!d
y 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 quit
tan 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