¿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' filenamewhere24is 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 < inputconwc -l input. Debería ser más rápido por unos pocos nanosegundos :)wc -l inputgenera 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
heady 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<> filecon> other-file && mv other-file file, por ejemplo).fuente
1<>que no estaba familiarizado. Además,spongedesde moreutils es una buena herramienta para las tuberías donde desea sobrescribir su entrada.Supongamos que queremos reemplazar las últimas
7lí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
taily 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