Como posso selecionar a primeira ocorrência entre dois padrões, incluindo eles. De preferência, usando sed
ou awk
.
Eu tenho:
text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text
Quero a primeira ocorrência das linhas entre P1 e P2 (incluindo a linha P1 e a linha P2):
something P1 something
content1
content2
something P2 something
sed
awk
regular-expression
kofucii
fonte
fonte
sed
... isso é um bug nased
execução e não no script acima./P2/q
no meu sistema; é isso aí. Eu estava curioso sobre alguma coisa e queria compartilhar o que encontrei.com
awk
fonte
Em
sed
:-n
suprime a impressão padrão e você imprime linhas entre os intervalos de endereços correspondentes usando op
comandoq
) quando a primeiraP2
correspondência.Isso falhará se um
P2
vier antesP1
. Para lidar com esse caso, tente:fonte
Se você quiser pular os padrões, aqui está a
awk
versão:fonte
Uma
awk
solução mais simples (meio caminho entre a resposta do iruvar e a resposta do muru , mas sem usar uma variável):e, como muru observou, se o primeiro P2 aparecer antes do primeiro P1, isso não imprimirá nada.
Obviamente, se você deseja imprimir todos os intervalos P1-P2:
apenas deixe de fora a
exit
parte:fonte
Saia imediatamente após a impressão, não antes.
fonte
Para ignorar os próprios padrões e mostrar apenas o primeiro bloco correspondente no único GNU sed:
fonte