2011-03-08 11 views
54

Tengo un archivo que se compone de varias líneas de texto:¿Cómo elimino todas las líneas de un archivo a partir de después de una línea coincidente?

The first line 
The second line 
The third line 
The fourth line 

tengo una cadena que es una de las líneas: The second line

Quiero borrar la cadena y todas las líneas después de ella en el archivo, por lo que eliminará The third line y The fourth line además de la cadena. El archivo se convertiría en:

The first line 

He buscado una solución en Google, y parece que yo debería usar sed. Algo como:

sed 'linenum,$d' file 

¿Pero cómo encontrar el número de línea de la cadena? O bien, ¿de qué otra manera debería hacerlo?

+0

Su planteamiento del problema es contradictoria: 'Quiero borrar todas las líneas ** ** después de la línea' significa que elimina sólo dos líneas (como usted dice), pero luego de su salida de ejemplo se muestra la línea de solape como desaparecidas también. ¿Qué es lo que realmente quieres? –

+0

La línea correspondiente Y todas las líneas después de ella. Debería mejorar mi inglés. Gracias por tu información. – DocWiki

Respuesta

84

Si no desea imprimir la línea encajada (o cualquier siguientes líneas):

sed -n '/The second line/q;p' inputfile 

Esto dice " cuando llegue a la línea que coincida con el patrón, deje de imprimir cada línea ". La opción -n impide la impresión implícita y se requiere el comando p para imprimir líneas explícitamente.

o

sed '/The second line/,$d' inputfile 

Esto dice "Eliminar todas las líneas de la salida a partir de la línea encajada y continuando hasta el final del archivo".

pero la primera es más rápida. Sin embargo, dejará de procesar por completo, por lo que si tiene varios archivos como argumentos, los que están después del primer archivo coincidente no se procesarán. En este caso, el formulario de eliminación es mejor.

Si desea imprimir la línea encajada, pero no todas las líneas siguientes:

sed '/The second line/q' inputfile 

esto dice "imprimir todas las líneas y dejar de fumar cuando se alcanza la línea encajada" (la opción -n (sin impresión implícita) no se usa).

Consulte man sed para obtener información adicional.

+3

Pero algunos comandos se vuelven inquietos sobre las tuberías rotas (RCS 'co-p', por ejemplo), y luego está mejor con la notación' sed '/ The second line /, $ d''. –

+0

¿Puede agregar explicaciones? –

+0

@AhmadAbdelghany: Explicaciones agregadas. –

5
sed '/The second line/q0' file 

O, sin sed de GNU:

sed '/The second line/q' file 

O, usando grep:

grep -B 9999999 "The second line" 
+0

¡Muchas gracias! ¿Puede decirme cómo puedo encontrar el número de línea de una cadena específica, que todavía no sé? – DocWiki

+0

grep -n archivo "La segunda línea" | awk -F: '{print $ 1}' – Erik

+0

@DocWiki: no necesita el número de línea; lo buscas. 'sed"/$ string /, \ $ d "inputfile'. –

0

Primero se debe agregar el número de línea y eliminar la línea

cat new.txt 
The first line 
The second line 
The third line 
The fourth line 

cat new.txt | nl 
    1 The first line 
    2 The second line 
    3 The third line 
    4 The fourth line 



cat new.txt | nl | sed "/2/d" 
    1 The first line 
    3 The third line 
    4 The fourth line 

cat new.txt | nl |sed "3d;4d" 
    1 The first line 
    2 The second line 

usando awk

awk 'NR!=3 && NR!=4' new.txt 
The first line 
The second line 
4

Utilizando awk (que no muestren la línea encajada)

awk '/pattern/ {exit} {print}' file.txt 
0
awk '/The second line/{exit}1' file 
15

Esto es un poco más corto que otras soluciones dadas. Salir con mayúscula Q evita imprimir la línea actual.

sed '/The second line/Q' file 

Para eliminar realmente las líneas, puede usar la misma sintaxis.

sed -i '/The second line/Q' file 
+1

Esta es, de lejos, mi solución favorita. – TryTryAgain

Cuestiones relacionadas