Eu tenho o seguinte array dentro de um programa:
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
Quero usar awk
para imprimir linhas da primeira ocorrência de $packages até o primeiro final ]
, após a ocorrência de $packages
.
Como posso fazer isso?
Responder1
Itere sobre os registros, mantenha um identificador para $packages
, imprima linhas quando o identificador for definido e saia após a impressão quando encontrar o próximo ]
:
awk '/\$packages/ {c=1; print; next} /\]/ {print; exit}; c{print}'
Exemplo:
% 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
]
Responder2
Usamos o range
operador ,
de sed
para selecionar o intervalo de linhas em que estamos interessados. Para este cenário, o intervalo começa com a string $package
e termina com ]
(em linhas diferentes).
Primeiro, rejeitamos quaisquer linhas fora do intervalo /\$package/,/]/!d
e, a partir do intervalo, imprimimos todas elas (devido à impressão implícita da propriedade de espaço padrão de sed
), MAS quit
assim que a linha com a string ]
for encontrada. isso implica, imprimimos para stdout o primeiro dos intervalos/\$package/,/]/
sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile