sed, inserta el archivo antes de la última línea

sed, inserta el archivo antes de la última línea

El siguiente método de inserción de archivos solía sedfuncionar, incluso antes de la última línea, pero ya no. ¿Es un error en la corriente sed?

Demostración del método de inserción de archivos con sed:

mkdir /tmp/test
printf '%s\n' {1..3} > /tmp/test/f1
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2

$ cat /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
1
2
3
nine
ten

$ head -9 /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
1
2
3

$ cat /tmp/test/f2 | sed -e "/ten/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
ten
1
2
3

$ sed --version
GNU sed version 4.2.1
... 

Es decir, el método de inserción del archivo antes de la línea funciona en todas partes excepto en la última línea. Solía ​​​​estar funcionando antes. ¿Es un error en la corriente sed?

Gracias

Respuesta1

Ya que estás encendido, gnu sedpodrías usar

'e [COMMAND]'
     This command allows one to pipe input from a shell command into
     pattern space.

en la última $línea:

sed '$e cat insert.txt' file

Con ed(reemplace ,pcon wsi desea editar en el lugar):

ed -s file<<IN
- r insert.txt
,p
q
IN

o

ed -s file <<< $'-1 r insert.txt\n,p\nq\n'

Cuando edse lee, filela dirección actual se establece en la última $línea. -(o -1) establece la dirección actual en una línea antes (es decir $-1, ) y rlee insert.txtdespués de la línea actual. ,pimprime el contenido del búfer de texto (como dije, reemplácelo con wpara guardar los cambios) y qsale del editor.

Respuesta2

Según tu comentario "TIENES QUEpartido contra la última línea", por lo que consideraría usar $(última línea) e i(insertar comando) en sed. Por ejemplo:

sed '$ i\INSERT BEFORE LAST LINE' number.txt
1
2
3
4
INSERT BEFORE LAST LINE
5

Solo asegúrese de que el archivo no tenga una línea vacía como última línea y debería funcionar. Tenga en cuenta el espacio entre el signo de dólar y ila barra invertida ( \) después de i. Esto insertará el texto después de la barra invertida hasta la última línea sin necesidad de a /pattern/para la última línea.

NOTA: Este comando solo agregará una línea de texto antes de la línea final, no un archivo. Si desea insertar el contenido de un archivo antes de la última línea.

Si desea agregar un archivo completo (y no lo desea si está en sed), usaría esto:

    head -n-1 first_file.txt && cat inserted_file.txt && tail -n1 first_file.txt 

Esto debería mostrar todo excepto la última línea, luego catel inserted_file.txty luego mostrar la última línea del archivo first_file.txt.

información relacionada