linux - sustituir - ¿Cómo elimino todas las líneas en un archivo a partir de después de una línea coincidente?
sed linux (6)
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
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 cuerda que es una de las líneas: The second line
Quiero eliminar 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 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?
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
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 coincida con el patrón, de lo contrario, imprima cada línea". La opción -n
evita 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 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 "imprimir todas las líneas y salir cuando se alcanza la línea coincidente" (no se usa la opción -n
(sin impresión implícita)).
Ver man sed para información adicional.
Uso de awk (no muestra la línea coincidente)
awk ''/pattern/ {exit} {print}'' file.txt
awk ''/The second line/{exit}1'' file
sed ''/The second line/q0'' file
O bien, sin gnu sed:
sed ''/The second line/q'' file
O, usando grep:
grep -B 9999999 "The second line"