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 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 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' inputfile
Esto dice "cuando llegue a la línea que coincide con el patrón, salga, de lo contrario imprima cada línea". La
-n
opción evita la impresión implícita yp
se requiere el comando para imprimir líneas explícitamente.o
sed '/The second line/,$d' inputfile
Esto 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' inputfile
Esto dice "imprima todas las líneas y salga cuando se alcance la línea coincidente" (la
-n
opción (sin impresión implícita) no se usa).Consulte man sed para obtener información adicional.
fuente
co -p
por ejemplo), y luego está mejor con lased '/The second line/,$d'
notación.p
posteriores;
.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' file
Para eliminar realmente las líneas, puede usar la misma sintaxis.
sed -i '/The second line/Q' file
fuente
sed '/The second line/q0' file
O, sin gnu sed:
sed '/The second line/q' file
O, 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.txt
fuente
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 line
usando awk
awk 'NR!=3 && NR!=4' new.txt The first line The second line
fuente
awk '/The second line/{exit}1' file
fuente