¿Cómo puedo seleccionar la primera aparición entre dos patrones, incluidos ellos? Preferiblemente usando sed
o awk
.
Yo tengo:
text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text
Quiero la primera aparición de las líneas entre P1 y P2 (incluidas la línea P1 y la línea P2):
something P1 something
content1
content2
something P2 something
sed
awk
regular-expression
kofucii
fuente
fuente
sed
... eso es un error en el quesed
está ejecutando, y no en el script anterior./P2/q
mi sistema; Eso es. Tenía curiosidad por algo y quería compartir lo que encontré.con
awk
fuente
En
sed
:-n
suprime la impresión predeterminada e imprime líneas entre los rangos de direcciones coincidentes con elp
comandoq
) cuandoP2
coinciden las primeras .Esto fallará si a
P2
viene antesP1
. Para manejar ese caso, intente:fuente
Si desea omitir los patrones, esta es la
awk
versión:fuente
Una simple
awk
solución (una especie de mitad de camino entre la respuesta de Iruvar y la respuesta de Muru , pero no el uso de una variable):y, como señaló muru, si el primer P2 aparece antes del primer P1, esto no imprimirá nada.
Por supuesto, si desea imprimir todos los rangos P1-P2:
solo deja de lado la
exit
parte:fuente
Salga inmediatamente después de la impresión, no antes.
fuente
Para omitir los patrones en sí mismos y mostrar solo el primer bloque coincidente en un solo GNU sed:
fuente