Sé que al usar el "-A NUM"
interruptor puedo imprimir un número específico de líneas finales después de cada coincidencia. Me pregunto si es posible imprimir líneas finales hasta que se encuentre una palabra específica después de cada coincidencia. Por ejemplo, cuando busco "Palabra A", quiero ver la línea que contiene "Palabra A" y también las líneas posteriores hasta la que contiene "Palabra D".
contexto:
Word A
Word B
Word C
Word D
Word E
Word F
mando:
grep -A10 'Word A'
Necesito esta salida:
Word A
Word B
Word C
Word D
| sed -e '1d;$d'
, es decir, elimine la primera y última líneased -n -e '/pattern A/,/pattern D/d; p'
Esto dice, "elimine del patrón A al patrón D e imprima todo lo demás". Lamentablemente, este partido es codicioso. Eso significa que si los patrones A y D aparecen más de una vez, vas a hacer coincidir desde el primer patrón A hasta el último patrón D. Me temo que Perl o Python son tus amigos si ese es el caso.¿por qué no usar awk?
fuente
Word D
cae en la misma línea queWord A
, y posiblemente en otra parte, por ejemplo,Word A Word D\nWord D
con sed mostrará dos líneas donde como awk mostrará una. Además, todavía se pueden usar variables con awk, por ejemplo, porawk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file"
lo que puede ser más eficiente, pero cuando se trata de búsquedas de dos cadenas que pueden o no caer en la misma línea, awk definitivamente será más confiable.A
yB
solo desea capturar lo que hay entre cada secuencia. Parece que sed no sigue esta semántica en mi caso al menos.o
fuente
sed
para esto, a menos que necesite el poder de las expresiones regulares de Perl para seleccionar las líneas delimitadoras.