Estoy tratando de imprimir la línea coincidente y la cuarta línea desde la línea coincidente (línea que contiene la expresión que estoy buscando).
He estado usando el siguiente código:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
Pero esto solo imprime la línea coincidente.
Esto imprime solo la cuarta línea.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
Necesito imprimir tanto la línea coincidente como la cuarta línea solamente.
shell-script
debatir
fuente
fuente

egrep "pattern" -A4grep -A 4 "pattern" file | sed -n '4p'hace exactamente lo que quieres, a menos que te malinterprete</td>que no es la cuarta líneaRespuestas:
En awk, lo harías de la siguiente manera
o
Explicación
La primera solución encuentra todas las líneas que coinciden
pattern. Cuando encuentra una coincidencia, almacena el número de registro (NR) en la matriznr. También almacena el cuarto registro deNRla misma matriz. Esto lo hace elnr[NR+4].NRLuego se comprueba cada registro ( ) para ver si está presente en lanrmatriz, de ser así, se imprime el registro.La segunda solución funciona esencialmente de la misma manera, excepto cuando se encuentra con
patternque imprime esa línea, y luego almacena el cuarto registro delante de él en la matriznr, luego pasa al siguiente registro. Luego, cuandoawkencuentre este cuarto registro, elNR in nrbloque se ejecutará e imprimirá este registro +4 allí después.Ejemplo
He aquí un ejemplo de archivo de datos,
sample.txt.Usando la primera solución:
Usando la segunda solución:
fuente
awkaccesos directos aquí, ¿podría agregar una breve explicación (cosas como la impresión está implícita en awk y que las matrices son asociativas, etc.)?Simplemente estoy agregando una eliminación de las líneas apropiadas, antes de imprimir
{ 3,5d ; p }.fuente
sed: -e expression #1, char 18: unknown option tos'`Puede probar la
-Aopción congrep, que especifica cuántas líneas después de la línea coincidente deben imprimirse. Combine estosedy obtendrá las líneas requeridas.grep -A 4 pattern input.txt | sed -e '2,4d'Usando
sed, eliminamos el de la segunda línea hasta la cuarta.fuente
patternen el archivo.Aquí hay una manera en Perl que puede manejar un número arbitrario de líneas coincidentes:
En perl. La variable especial
$.es el número de línea actual. Entonces, cada vez que encuentro una coincidencia de líneapattern, la imprimo y guardo su número de línea como$c. Luego imprimo nuevamente cuando el número de línea actual es 4 más que el impreso anteriormente.fuente
Básicamente estás haciendo una búsqueda y reemplazo. Puede agregar solo un hallazgo en el mismo comando y los imprimirá a ambos :)
fuente