Quiero eliminar algunos n líneas del final de un archivo. ¿Se puede hacer esto usando sed?
Por ejemplo, para eliminar líneas de 2 a 4, puedo usar
$ sed '2,4d' file
Pero no sé los números de línea. Puedo eliminar la última línea usando
$sed $d file
pero quiero saber la forma de eliminar n líneas del final. Por favor, hágame saber cómo hacerlo usando sed o algún otro método.
sed
?sed $d file
devuelve un error En cambio, $ d debería estar entre comillas, así:sed '$d' file
Respuestas:
No lo sé
sed
, pero se puede hacer conhead
:fuente
sed -e :a -e '$d;N;2,5ba' -e 'P;D' file
(,5
para las últimas 5 líneas).head
, pero no es estándar. De hecho, el estándar para loshead
estados:The application shall ensure that the number option-argument is a positive decimal integer.
head: illegal line count -- -2
Si la opción de codificación n es una opción, puede usar llamadas secuenciales para sed. Por ejemplo, para eliminar las últimas tres líneas, elimine la última línea tres veces:
fuente
De los one-liners sed :
Parece ser lo que estás buscando.
fuente
10
en'$d;N;2,10ba'
Una divertida y sencilla
sed
y latac
solución:NOTA
"
se necesitan comillas dobles para que el shell evalúe la$n
variable alsed
mando. En comillas simples, no se realizará ninguna interpolación.tac
es uncat
reverso, verman 1 tac
{}
insed
están ahí para separar$n
&d
(si no, el shell intenta interpolar$nd
variables no existentes )fuente
tac
digo no en osxport info coreutils
||brew info coreutils
;Use
sed
, pero deje que el shell haga los cálculos, con el objetivo de usar eld
comando dando un rango (para eliminar las últimas 23 líneas):Para eliminar las últimas 3 líneas, de adentro hacia afuera:
Da el número de líneas del archivo: digamos 2196
Queremos eliminar las últimas 23 líneas, así que para el lado izquierdo o rango:
Da: 2174 Así, la interpretación original de sed después de la concha es:
¡Con la
-i
edición in situ, el archivo ahora tiene 2173 líneas!Si desea guardarlo en un nuevo archivo, el código es:
fuente
Podrías usar cabeza para esto.
Utilizar
$ head --lines=-N file > new_file
donde N es el número de líneas que desea eliminar del archivo.
Los contenidos del archivo original menos las últimas N líneas están ahora en new_file
fuente
Solo para completar, me gustaría agregar mi solución. Terminé haciendo esto con el estándar
ed
:Esto elimina las últimas 2 líneas usando la edición en el lugar (¡aunque sí usa un archivo temporal en
/tmp
!)fuente
Para truncar archivos muy grandes realmente en su lugar, tenemos un
truncate
comando. No conoce las líneas, perotail
+wc
puede convertir líneas a bytes:Hay una condición de carrera obvia si el archivo se escribe al mismo tiempo. En este caso, puede ser mejor usarlo
head
: cuenta los bytes desde el comienzo del archivo (mind disk IO), por lo que siempre truncaremos en el límite de la línea (posiblemente más líneas de las esperadas si el archivo se escribe activamente):Práctico one-liner si falla el intento de inicio de sesión poniendo la contraseña en lugar del nombre de usuario:
fuente
Esto podría funcionar para usted (GNU sed):
fuente
'
).d
,D
oP
con GNU sed y no en la versión posix. Parece que las líneas no se imprimen después deD
y se mantienen en el búfer de trabajo para un nuevo bucle sin pasar al final de la línea de acciones.D
hacer el efecto contrario.La mayoría de las respuestas anteriores parecen requerir comandos / extensiones de GNU:
Para una solución un poco más portátil:
O
O
Donde "10" es "n".
fuente
Con las respuestas aquí, ya habrás aprendido que sed no es la mejor herramienta para esta aplicación.
Sin embargo, creo que hay una manera de hacer esto al usar sed; la idea es agregar N líneas para mantener el espacio hasta que pueda leer sin presionar EOF. Cuando se golpea EOF, imprima el contenido del espacio de espera y salga.
El comando sed anterior omitirá las últimas 5 líneas.
fuente
Pruebe el siguiente comando:
fuente
=
.tail -r
donde otros han usadotac
para invertir el orden de las líneas y hacer que las últimasn
líneas se conviertan en lasn
primeras.Se puede hacer en 3 pasos:
a) Cuente el número de líneas en el archivo que desea editar:
b) Reste de ese número el número de líneas a eliminar:
c) Indique a sed que elimine de ese número de línea (
$x
) hasta el final:fuente
sed
para eliminar las líneas 7 a 10, es decir 4 líneas, no 3.Puede obtener el recuento total de líneas con
wc -l <file>
y usarhead -n <total lines - lines to remove> <file>
fuente
Esto eliminará las últimas 3 líneas de
file
:for i in $(seq 1 3); do sed -i '$d' file; done;
fuente
sed
.Prefiero esta solución
donde N es el número de líneas para eliminar.
fuente
versión posix
fuente
Para eliminar las últimas 4 líneas:
fuente
tac file | sed '1,4d' | tac
porque ordenar y luego eliminar el prefijo cuesta muchos recursos.tac
comando en algunos sistemas (por ejemplo, FreeBSD?)Se me ocurrió esto, donde n es el número de líneas que desea eliminar:
Es una pequeña rotonda, pero creo que es fácil de seguir.
fuente
Para eliminar las últimas N líneas de un archivo, puede usar el mismo concepto de
Puede usar un combo con comando de cola para revertir el archivo: si N es 5
Y de esta manera también se ejecuta donde el
head -n -5 file
comando no se ejecuta (¡como en una Mac!).fuente
Esto eliminará las últimas 12 líneas.
fuente