
El siguiente método de inserción de archivos solía sed
funcionar, 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 sed
podrí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 ,p
con w
si 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 ed
se lee, file
la 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 r
lee insert.txt
después de la línea actual. ,p
imprime el contenido del búfer de texto (como dije, reemplácelo con w
para guardar los cambios) y q
sale 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 i
la 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 cat
el inserted_file.txt
y luego mostrar la última línea del archivo first_file.txt
.