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

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

демо вставки метода файла с sed:

mkdir /tmp/test
printf '%sn' {1..3} > /tmp/test/f1
printf '%sn' {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
... 

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

спасибо

30
задан xpt
09.04.2023 7:44 Количество просмотров материала 3057
Распечатать страницу

2 ответа

так как вы находитесь на gnu sed можно использовать

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

Ла$линия t:

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 текущий адрес установлен в la$линия t. - (или -1) устанавливает текущий адрес на одну строку перед (т. е. $-1) и r, - говорится в insert.txt to после текущей строки. ,p выводит содержимое текстового буфера (как я уже говорил, замените на w для сохранения изменений) и q выход из редактора.

5
отвечен don_crissti 2023-04-10 15:32

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

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

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

Примечание: эта команда добавит только одну строку текста перед последней строкой, а не файл. Если вы хотите вставить содержимое файла перед последней строкой.

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

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

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

5
отвечен skamazin 2023-04-10 17:49

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх