Estou tentando usar sed
para imprimir todas as linhas até mas excluindo um padrão específico. Não entendo porque o seguinte não funciona:
sed '/PATTERN/{d;q}' file
De acordo com meu entendimento de script sed, essa expressão deve causar o seguinte:
- Quando uma linha corresponder
/PATTERN/
, execute o grupo que consiste em comandos parad
elete o espaço do padrão (= a linha atual)q
uit depois de imprimir o espaço do padrão atual
Isoladamente, tanto /PATTERN/d
e /PATTERN/q
trabalho; ou seja, d
exclui a linha incorreta e q
faz sed
com que seja encerrada, mas após imprimir a linha , conforme documentado. Mas agrupar as duas operações em um bloco aparentemente faz q
com que seja ignorado.
Eu sei que posso usar Q
em vez de {d;q}
como uma extensão GNU (e isso funciona como esperado!), mas estou interessado em entender por que o acima não funciona e de que maneira estou interpretando mal a documentação.
Meu caso de uso real é (apenas um pouco) mais complexo, já que a primeira linha do arquivo realmente corresponde ao padrão, e estou pulando isso (depois de fazer alguma substituição):
sed -e '1{s/>21/>chr21/; n}' -e '/>/{d;q}' in.fasta >out.fasta
Mas o caso simplificado acima exibe o mesmo comportamento.