Мне нужно скопировать содержимое текстового файла и вставить его в другой текстовый файл. Первый текстовый файл содержит 10 строк данных, и мне нужно, чтобы они были скопированы во второй текстовый файл, начиная со строки № 5 (например). Таким образом, во втором текстовом файле эти данные должны быть записаны из строки 5 в строку 14. Как это можно сделать? Заранее спасибо. Считайте меня новичком в отношении Linux.
head
и tail
решение Предположим, исходный файл называется ~/a
, а файл для вставки называется ~/b
. Мы поместим объединенный файл в ~/c
:
head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
~/
- это короткая рука для вашего /home/user
имени каталога a
во вновь созданный файл c
b
и добавляет его в файл c
a
, начиная с строка 6 до конца файла c
После проверки того, что файл c
правильно объединен из файлов a
и b
, мы Переименуем c
в a
с помощью:
mv ~/c ~/a
mv
переместим файл c
в файл a
. Данные физически не перемещаются. Файл просто переименовывается, что экономит время. Самый простой инструмент здесь может быть sed
. Чтобы вставить b.txt
в a.txt
после 5-й строки, вы можете написать:
sed '5r b.txt' a.txt
sed
считывает файл, указанный в качестве аргумента (a.txt
), строку за строкой. Все строки воспроизводятся в выходных данных так же, как они появлялись во входных данных, если только они не были изменены командой.
5
- это адрес (номер строки), по которому должна быть выполнена следующая команда. Используемая нами команда - r
, которая принимает имя файла в качестве аргумента (здесь b.txt
), полностью его читает и вставляет в вывод после текущей строки.
Как указано выше, эта командная строка sed
будет печатать только вывод на терминал, без записи в какие-либо файлы. Вы можете либо перенаправить его в новый файл (а не во входные файлы!), Используя перенаправление вывода Bash:
sed '5r b.txt' a.txt > c.txt
, либо вы можете напрямую изменить внешний входной файл a.txt
с помощью sed
' s -i
(для «на месте») переключатель. Если вы напишите его как -i.bak
, он сначала создаст резервную копию исходного входного файла с суффиксом .bak
:
sed -i '5r b.txt' a.txt
Пример:
$ cat a.txt
January
February
March
April
May
October
November
December
$ cat b.txt
June
July
August
September
$ sed '5r b.txt' a.txt
January
February
March
April
May
June
July
August
September
October
November
December
(Повторное использование элегантного примера из @ByteCommander:)
awk '1; NR==5 {system("cat b.txt")}' a.txt