
Следующий метод вставки файла раньше 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
.