7

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

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

Спасибо

2 ответа2

5

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

5

Согласно вашему комментарию, вы «должны сопоставлять последнюю строку », поэтому я хотел бы рассмотреть возможность использования $ (последняя строка) и 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 на inserted_file.txt , а затем отобразить последнюю строку first_file.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .