¿Cómo filtrar 2 líneas para cada línea que coincida con la expresión regular grep?
Esta es mi prueba mínima:
SomeTestAAAA
EndTest
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestAABC
EndTest
SomeTestACDF
EndTest
Y obviamente lo intenté, por ejemplo, grep -vA 1 SomeTestAAque no funciona.
la salida deseada es:
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
text-processing
grep
Behrooz
fuente
fuente

Respuestas:
Puede usar
grepcon-P(PCRE):(?!AA)es el patrón de búsqueda negativa negativo de ancho cero que garantiza que no haya unAAdespuésSomeTest.Prueba :
fuente
\.sogrep -P -A 1 'SomeTest\.(?!AA)' file.txtogrep -P -A 1 'SomeTest(?!\.AA)' file.txtSomeTest*\nEndTestlo que actualmente está haciendogrepping a todas las líneas que coincidenSomeTest*pero no aSomeTestAA+ una línea de contexto después de la coincidencia. Agregue algunas líneas más a la entrada (por ejemplo, agregue una líneafoobardespués de cadaEndTestlínea) y luego vuelva a intentarlo.Aquí hay una
sedsolución (-nes decir, sin impresión automática) que funciona con entradas arbitrarias:así que con una entrada como
corriendo
salidas
es decir, elimina exactamente las líneas que
grep -A1 SomeTestAA infileseleccionarían:fuente
//coincidía/SomeTestAA/. Pensé, en este caso, habría igualado la expresión negada:/SomeTestAA/!. (+1)!no es parte del RE , es unasedcosa.Es posible que tenga mejor suerte con algo que considera las regiones de varias líneas como registros únicos. Hay una
sgrepque no he usado mucho.También hay awk, donde puede configurar el separador de registros de entrada y el separador de registros de salida, a lo que desee.
La mayor parte del programa awk está entre comillas simples, pero cambio a comillas dobles al final para que la
$patvariable de shell se pueda expandir.fuente
awk -vpat="^SomeTestAA" -vRS="\nEndTest\n" 'BEGIN{ ORS=RS } $0 !~ pat' fileUna opción es utilizar
perlcompatibleregularexpressiongrep:La opción
-Mpermite que el patrón coincida con más de una línea.fuente
grepya es compatible con PCRE (a través de la-Popción), ¿cuál es la ventaja de usarpcregrep?grepno admite la-Mopción.Usando estándar
sed:La
sedsecuencia de comandos analiza la línea de archivo de entrada por línea, y cuando una línea coincide con el patrónSomeTestAA, los dossedcomandos de ediciónNydse ejecutan. ElNcomando agrega la siguiente línea de entrada al espacio del patrón (el búfer quesedpuede editar), ydelimina el espacio del patrón y comienza el siguiente ciclo.fuente
Intenté con el comando Abajo sed y funcionó bien
mando
salida
fuente
Puede usar
sedeldcomando de GNU para eliminar una línea y agregarle un prefijo/pat/,+Npara seleccionar líneas que coincidan con el patrón y las N líneas subsiguientes . En su caso, N = 1 ya que solo desea eliminar la única línea posterior después de una línea coincidente:fuente