¿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 SomeTestAA
que no funciona.
la salida deseada es:
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
text-processing
grep
Behrooz
fuente
fuente
Respuestas:
Puede usar
grep
con-P
(PCRE):(?!AA)
es el patrón de búsqueda negativa negativo de ancho cero que garantiza que no haya unAA
despuésSomeTest
.Prueba :
fuente
\.
sogrep -P -A 1 'SomeTest\.(?!AA)' file.txt
ogrep -P -A 1 'SomeTest(?!\.AA)' file.txt
SomeTest*\nEndTest
lo que actualmente está haciendogrep
ping 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íneafoobar
después de cadaEndTest
línea) y luego vuelva a intentarlo.Aquí hay una
sed
solución (-n
es 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 infile
seleccionarían:fuente
//
coincidía/SomeTestAA/
. Pensé, en este caso, habría igualado la expresión negada:/SomeTestAA/!
. (+1)!
no es parte del RE , es unased
cosa.Es posible que tenga mejor suerte con algo que considera las regiones de varias líneas como registros únicos. Hay una
sgrep
que 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
$pat
variable de shell se pueda expandir.fuente
awk -vpat="^SomeTestAA" -vRS="\nEndTest\n" 'BEGIN{ ORS=RS } $0 !~ pat' file
Una opción es utilizar
p
erlc
ompatibler
egulare
xpressiongrep
:La opción
-M
permite que el patrón coincida con más de una línea.fuente
grep
ya es compatible con PCRE (a través de la-P
opción), ¿cuál es la ventaja de usarpcregrep
?grep
no admite la-M
opción.Usando estándar
sed
:La
sed
secuencia de comandos analiza la línea de archivo de entrada por línea, y cuando una línea coincide con el patrónSomeTestAA
, los dossed
comandos de ediciónN
yd
se ejecutan. ElN
comando agrega la siguiente línea de entrada al espacio del patrón (el búfer quesed
puede editar), yd
elimina 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
sed
eld
comando de GNU para eliminar una línea y agregarle un prefijo/pat/,+N
para 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