Eu gostaria de escrever um script com os seguintes requisitos:
- na entrada, obtenha uma lista de pacotes disponíveis via
apt
. Lá você pode ter alguns pacotes que são instalados automaticamente por outros pacotes na lista. - na saída, forneça a mesma lista sem os pacotes que dependem de outros pacotes na lista.
Em outros termos, quero fazer no bash o que o usuário François G fez nesta resposta
Talvez já exista algo assim, mas às vezes eu gosto de escrever scripts para melhorar meu script bash e também por diversão.
Na minha cabeça, já desenhei o roteiro, mas tenho um problema técnico. Vamos supor que eu tenha a lista de dependências neste formato (é a maneira de apt-rdepends
colocar):
useless-line-1
useless-line-2
useless-line-3
item-1
fixed-string substring-1-1
fixed-string substring-1-2
fixed-string substring-1-3
item-2
fixed-string substring-2-1
fixed-string substring-2-2
item-3
item-4
fixed-string substring-4-1
fixed-string substring-4-2
fixed-string substring-4-3
fixed-string substring-4-4
Eu quero extrair o parágrafo relacionado a item-1
ie:
fixed-string substring-1-1
fixed-string substring-1-2
fixed-string substring-1-3
Não sou awk
especialista, mas acho que pode atender aos meus propósitos. Não consigo "construir" o comando correto. Devido ao fato de que item-2
pode não ser conhecido, tentei:
# extract text between item-1 and the next line that starts without blank
$ awk '/item-1/,/^[A-Za-z0-9]/' deplist
item-1
mas item-1
já se encaixa na condição ^[A-Za-z0-9]
, então não é bom. Além disso, quero excluir item-1
e item-2
da saída.
Qual é a melhor maneira de extrair essa parte dos dados?
Você poderia fazer algo "stateful" ex.
Como isso funciona:
definido
p=0
sempre que combinarmos uma linha que estrela com qualquer coisa que não seja um espaço em branco horizontal (você pode usar seu original um pouco mais específico^[A-Za-z0-9]
aqui)definido
p=1
se correspondermos ao desejado^item
imprimir sempre
p==1
Essencialmente, "ligue a impressão quando corresponder ao item desejado e desligue-a quando corresponder a qualquer outro item".
Você precisará de um pouco de lógica extra para pular a linha correspondente:
Aqui, realizamos a mesma correspondência, mas salvamos o resultado na variável
m
; então definap=1
quandom
é verdadeiro (esta parte é idêntica ao que tínhamos antes); então só imprimimos quando ambosp==1
em==0
ie pulam a linha onde ocorre a correspondência real.