yo uso esto
cat foo.txt | sed '/bar/d'
para eliminar líneas que contienen la cadena baren el archivo.
Sin embargo, me gustaría eliminar esas líneas y la línea directamente después de ella . Preferiblemente, en sed, awku otra herramienta que está disponible en MinGW32.
Es una especie de reverso de lo que puedo conseguir en grepcon -Ay -Bpara 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
bardos líneas consecutivas, esto eliminará la segunda línea sin analizarla. Por ejemplo, si tiene un archivo de 3 líneasbar/bar/foo, lafoolínea permanecerá.fuente
bars 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
barpuede 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
sedcon la solución @MichaelRollins o:fuente
/bar/con/bar|baz|whatever/. Ensedesa sintaxis no parece funcionar.seduso 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 -A100%, también debe manejar cualquier número debarlí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.txtSi alguna línea inmediatamente después de un partido se debe eliminar, entonces su
sedprograma 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
sedlee 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,
sedcomprueba la línea anterior para una coincidencia ymatch, si!no se encuentra, se ejecutan las dos expresiones en la{función}.sedvoluntadgy 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 hacematchse estaprintedEsto 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.
matchmatchmatchSi 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