sed, вставить файл перед последней строкой

sed, вставить файл перед последней строкой

Следующий метод вставки файла раньше sedработал, даже до последней строки, но больше нет. Это ошибка в текущем sed?

Демонстрация метода вставки файла с помощью 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
... 

То есть метод вставки файла перед строкой работает везде, кроме последней строки. Раньше работало. Это баг в текущем sed?

Спасибо

решение1

Поскольку вы находитесь на, gnu sedвы могли бы использовать

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

на лат $. линии:

sed '$e cat insert.txt' file

На ed(замените ,pна w, если хотите редактировать на месте):

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

или

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

При edчтении fileтекущий адрес устанавливается на последнюю $строку. -(или -1) устанавливает текущий адрес на одну строку раньше (т. е. $-1) и rсчитывает в insert.txtстроку после текущей. ,pпечатает содержимое текстового буфера (как я уже сказал, замените на , wчтобы сохранить изменения) и qвыходит из редактора.

решение2

Согласно вашему комментарию, вам «НУЖНОсопоставьте с последней строкой", поэтому я бы рассмотрел возможность использования $(последней строки) и i(команды вставки) в sed. Например:

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

Просто убедитесь, что файл не имеет пустой строки в качестве последней строки, и это должно работать. Обратите внимание на пробел между знаком доллара и iи обратную косую черту ( \) после i. Это вставит текст после обратной косой черты в последнюю строку без необходимости a /pattern/для последней строки.

ПРИМЕЧАНИЕ: Эта команда добавит только одну строку текста перед последней строкой, а не файл. Если вы хотите вставить содержимое файла перед последней строкой.

Если вы хотите добавить целый файл (а вы этого не сделаете, если он находится в sed), я бы использовал это:

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

Это должно отобразить все, кроме последней строки, затем catи inserted_file.txtзатем отобразить последнюю строку файла first_file.txt.

Связанный контент