Tengo un archivo que se compone de varias líneas de texto:
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 eliminar la cadena y todas las líneas posteriores en el archivo, por lo que se eliminará The third liney The fourth lineademás de la cadena. El archivo se convertiría en:
The first line
He buscado una solución en Google y parece que debería usar sed. Algo como:
sed 'linenum,$d' file
Pero, ¿cómo encontrar el número de línea de la cadena? O, ¿de qué otra manera debería hacerlo?

Respuestas:
Si no desea imprimir la línea coincidente (o las siguientes líneas):
sed -n '/The second line/q;p' inputfileEsto dice "cuando llegue a la línea que coincide con el patrón, salga, de lo contrario imprima cada línea". La
-nopción evita la impresión implícita ypse requiere el comando para imprimir líneas explícitamente.o
sed '/The second line/,$d' inputfileEsto dice "eliminar todas las líneas de la salida comenzando en la línea coincidente y continuando hasta el final del archivo".
pero el primero es más rápido. 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 coincidente, pero no las siguientes líneas:
sed '/The second line/q' inputfileEsto dice "imprima todas las líneas y salga cuando se alcance la línea coincidente" (la
-nopción (sin impresión implícita) no se usa).Consulte man sed para obtener información adicional.
fuente
co -ppor ejemplo), y luego está mejor con lased '/The second line/,$d'notación.pposteriores;.Esto es un poco más corto que otras soluciones dadas. Dejar de usar Q mayúscula evita imprimir la línea actual.
sed '/The second line/Q' filePara eliminar realmente las líneas, puede usar la misma sintaxis.
sed -i '/The second line/Q' filefuente
sed '/The second line/q0' fileO, sin gnu sed:
sed '/The second line/q' fileO, usando grep:
grep -B 9999999 "The second line"fuente
sed "/$string/,\$d" inputfile.Usando awk (sin mostrar la línea coincidente)
awk '/pattern/ {exit} {print}' file.txtfuente
Primero agregue el número de línea y elimine 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 lineusando awk
awk 'NR!=3 && NR!=4' new.txt The first line The second linefuente
awk '/The second line/{exit}1' filefuente