yo uso esto
cat foo.txt | sed '/bar/d'
para eliminar líneas que contienen la cadena bar
en el archivo.
Sin embargo, me gustaría eliminar esas líneas y la línea directamente después de ella . Preferiblemente, en sed
, awk
u otra herramienta que está disponible en MinGW32.
Es una especie de reverso de lo que puedo conseguir en grep
con -A
y -B
para imprimir las líneas que coincidan, así como las líneas de antes / después de la línea encajada.
¿Hay alguna manera fácil de lograrlo?
text-processing
sed
awk
replace
jakub.g
fuente
fuente
Respuestas:
Si tiene GNU sed (por lo tanto, Linux o Cygwin no incrustado):
Si tiene
bar
dos líneas consecutivas, esto eliminará la segunda línea sin analizarla. Por ejemplo, si tiene un archivo de 3 líneasbar
/bar
/foo
, lafoo
línea permanecerá.fuente
bar
s consecutivos , por lo que este es muy fácil de recordar.sed '/bar/d'
si solo desea "Eliminar la línea que contiene cierta cadena" y no la siguiente.sed '/math/q'
sed '/bar/d'
Si
bar
puede ocurrir en líneas consecutivas, puede hacer:que se puede adaptar para eliminar más de 2 líneas cambiando las 2 anteriores con el número de líneas para eliminar, incluida la coincidente.
Si no, se hace fácilmente
sed
con la solución @MichaelRollins o:fuente
/bar/
con/bar|baz|whatever/
. Ensed
esa sintaxis no parece funcionar.sed
uso de expresiones regulares "extendidas". Más información aquí: gnu.org/software/sed/manual/html_node/… . Tenga en cuenta que esto también es aplicablegrep
. Aquí está mi propio ejemplo de trabajo:echo $'0a\n1b\n2c' | sed '/0a\|1b/d'
.No soy fluido en sed, pero es fácil hacerlo en awk:
El script awk dice: para una línea que contiene una barra, obtenga la siguiente línea (getline), luego omita todo el procesamiento posterior (siguiente). El patrón 1 al final imprime las líneas restantes.
Actualizar
Como se señaló en el comentario, la solución anterior no funcionó con consecutivos
bar
. Aquí hay una solución revisada, que lo tiene en cuenta:Ahora seguimos leyendo para omitir todas las / bar / líneas.
fuente
grep -A
100%, también debe manejar cualquier número debar
líneas consecutivas correctamente (eliminando todo el bloque y 1 línea después).Deberá utilizar las capacidades de scripting de sed para lograr esto.
Data de muestra:
El comando "N" agrega la siguiente línea de entrada en el espacio del patrón. Esto combinado con la línea de la coincidencia de patrón (/ bar /) serán las líneas que desea eliminar. Luego puede eliminar normalmente con el comando "d".
fuente
sed -e '/bar/{N;d}' sample1.txt
Si alguna línea inmediatamente después de un partido se debe eliminar, entonces su
sed
programa tendrá que considerar partidos consecutivos. En otras palabras, si elimina una línea que sigue a una coincidencia que también coincide, entonces probablemente también debería eliminar la línea que sigue a esa coincidencia.Se implementa simplemente, pero hay que mirar un poco hacia atrás.
Funciona intercambiando espacios de espera y patrón para cada línea leída, por lo que la última línea se puede comparar con la actual cada vez. Entonces, cuando
sed
lee una línea, intercambia el contenido de sus búferes, y la línea anterior es el contenido de su búfer de edición, mientras que la línea actual se coloca en el espacio de espera.Por lo tanto,
sed
comprueba la línea anterior para una coincidencia ymatch
, si!
no se encuentra, se ejecutan las dos expresiones en la{
función}
.sed
voluntadg
y el espacio de la bodega al sobrescribir el espacio de patrones - lo que significa que la línea actual es entonces tanto en los espacios de bodega y el patrón - y entonces//
comprobar que para un partido a su expresión regular más recientemente compilado -match
- y si él no lo hacematch
se estap
rintedEsto significa que una línea solo se imprime si no lo hace y la línea inmediatamente anterior no . También renuncia a cualquier intercambio innecesario por secuencias de es.
match
match
match
Si desea una versión que pueda eliminar un número arbitrario de líneas después de una
match
, necesitaría un poco más de trabajo:... reemplace el 5 con el número de líneas (incluida la línea coincidente) que desea eliminar ...
fuente