Imprimir do texto A da primeira instância para a primeira instância do texto B

Imprimir do texto A da primeira instância para a primeira instância do texto B

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 awkpara 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 rangeoperador ,de sedpara selecionar o intervalo de linhas em que estamos interessados. Para este cenário, o intervalo começa com a string $packagee termina com ](em linhas diferentes).

Primeiro, rejeitamos quaisquer linhas fora do intervalo /\$package/,/]/!de, a partir do intervalo, imprimimos todas elas (devido à impressão implícita da propriedade de espaço padrão de sed), MAS quitassim 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

informação relacionada