Esta pregunta ya tiene respuestas aquí :
Comentarios
Respuesta
grep
ganó » Te ayudaré aquí. Este es un trabajo que se logra mejor con sed
usando expresiones de rango:
$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke
sed -n
suprime la impresión automática, de modo que las líneas se imprimen solo si se solicita explícitamente. Y esto sucede cuando ocurre el rango /aaa/,/cdn/
.
Estas expresiones de rango también están disponibles en awk
, donde puede decir:
awk "/zdk/,/dke/" file
Por supuesto, todos estas condiciones se pueden expandir a una expresión regular más estricta como sed -n "/^aaa$/,/^cdn$/p" file
para verificar que las líneas consisten exactamente en aaa
y cdn
, nada más.
Comentarios
Vaya, tuve el mismo problema y no ' t pregunté. Usé 2 instancias de grep -n
y comparé el número para mi solución.
Las expresiones de rango @KipK son una herramienta muy útil para este tipo de problemas:) Puede también use awk
y algunas banderas, pero el caso básico es bastante sencillo con esto.
@Fedorqui, tengo algún problema si el patrón de búsqueda contiene xmls. como, necesito buscar comenzando con < ns0: abcd xmlns = " " >, obteniendo el resultado. Pero muestra < abcd xmlns = " " > también. Probé sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p archivo
@MukulAnand por favor proporcione un ejemplo para que podamos verificar
De cualquier manera cómo no imprimir el patrón inicial y final ellos mismos (excepto para usar head y tail)?
Responder
Puede ser realizado por sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
Responder
Aquí está el comando grep
:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
Puede lograr una coincidencia de varias líneas en grep
, pero necesitas usar perl-regexp para grep
(-P
, que no es compatible con todas las plataformas , como OS X), así que como solución alternativa, «estamos reemplazando nuevas líneas con el carácter _
y después de grep
, los volveremos a cambiar.
Alternativamente, puede usar pcregrep
que admite patrones de varias líneas (-M
).
O utilice ex
:
ex +"/aaa/,/cdn/p" -scq! file