¿Hay algún comando que me permita editar las últimas n líneas en un archivo? Tengo varios archivos, todos tienen un número diferente de líneas dentro. Pero me gustaría modificar las últimas n líneas en cada archivo. El objetivo es reemplazar las comas con punto y coma en las últimas n líneas. Pero solo en las últimas n líneas.
No quiero eliminar ninguna línea, solo quiero reemplazar cada coma con un punto y coma en las últimas n líneas de cada archivo.
Usando el comando sed, puedo reemplazar la última línea con este comando. Como se describe aquí: ¿Cómo puedo eliminar texto en la última línea de un archivo?
Pero esto solo me permite modificar la última línea, y no la última n cantidad de líneas.
text-processing
awk
sed
sku2003
fuente
fuente
sed '24,$s/,/:/g' filename
where24
is the start line`Respuestas:
Para reemplazar comas con punto y coma en las últimas n líneas con
ed
:Dividiendo eso aparte:
ed -s
= ejecutar ed en silencio (no informar los bytes escritos al final)'$-'
= desde el final del archivo ($
) menos ...$((n-1))
= n-1 líneas ...$' ... '
= cita el resto del comando para protegerlo del shell),$s/,/;/g
= ... hasta el final del archivo (,$
), busque y reemplace todas las comas con punto y coma.\nwq
= finalizar el comando anterior, luego guardar y salirPara reemplazar comas con punto y coma en las últimas n líneas con
sed
:Rompiendo eso aparte:
-i
= editar el archivo "en el lugar"$(( ... ))
= hacer algunas matemáticas:$( wc -l < input)
= obtener el número de líneas en el archivo-n + 1
= retroceder líneas n-1,\$
= desde n-1 líneas hasta el final del archivo:s/,/;/g
= reemplazar las comas con punto y coma.fuente
wc -l < input
conwc -l input
. Debería ser más rápido por unos pocos nanosegundos :)wc -l input
genera el nombre de archivo; solo queremos el recuento de líneasSolución usando tac y sed para reemplazar cada coma con un punto y coma en las últimas 50 líneas de file.txt:
fuente
Con GNU
head
y un shell tipo Bourne:Estamos sobrescribiendo el archivo sobre sí mismo. Eso está bien aquí por una transliteración byte a byte, pero no necesariamente si la modificación implica cambiar el tamaño del archivo (en cuyo caso, habría que desee reemplazar
1<> file
con> other-file && mv other-file file
, por ejemplo).fuente
1<>
que no estaba familiarizado. Además,sponge
desde moreutils es una buena herramienta para las tuberías donde desea sobrescribir su entrada.Supongamos que queremos reemplazar las últimas
7
líneas de la siguiente secuencia con script de shell e implementación GNU desed
:Paso 1 : obtengamos el número de secuencia de la última línea como el siguiente. Echa un vistazo a esto y aquello :
Paso 2 : establezcamos el número de líneas (al final de la secuencia) que pretendemos editar:
Paso 3 : calculemos la línea de inicio en función de variables anteriores, como las siguientes. Mira esto :
Paso 4 : Ahora, podemos reemplazar las últimas 7 líneas de secuencia con algo más, como lo siguiente. Mira esto :
El paso 4 está utilizando la sección 4.4 de la página de manual de sed que dice:
Paso 4, también está usando comillas dobles como se menciona aquí .
Bueno, los 4 pasos son innecesarios si usamos la respuesta de Gohu de esta manera:
fuente
Uso
tail
y tubería para sed:tail -n 20 file | sed 's/,/;/g'
Esto funciona en el archivo de las últimas 20 líneas. Si desea que las canges se dirijan directamente al archivo, use:
tail -n 20 file | sed -i 's/,/;/g'
fuente