Как я могу скопировать содержимое текстового файла и вставить его в другой, начиная с определенной строки?

Мне нужно скопировать содержимое текстового файла и вставить его в другой текстовый файл. Первый текстовый файл содержит 10 строк данных, и мне нужно, чтобы они были скопированы во второй текстовый файл, начиная со строки № 5 (например). Таким образом, во втором текстовом файле эти данные должны быть записаны из строки 5 в строку 14. Как это можно сделать? Заранее спасибо. Считайте меня новичком в отношении Linux.

12
задан 28 August 2017 в 00:31

3 ответа

head и tail решение

Предположим, исходный файл называется ~/a, а файл для вставки называется ~/b. Мы поместим объединенный файл в ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • Путь ~/ - это короткая рука для вашего /home/user имени каталога
  • Голова копирует первые пять строки файла a во вновь созданный файл c
  • cat перечисляет содержимое файла b и добавляет его в файл c
  • tail добавляет файл a, начиная с строка 6 до конца файла c

После проверки переименуйте объединенный файл

После проверки того, что файл c правильно объединен из файлов a и b, мы Переименуем c в a с помощью:

mv ~/c ~/a
  • mv переместим файл c в файл a. Данные физически не перемещаются. Файл просто переименовывается, что экономит время.
0
ответ дан 28 August 2017 в 00:31

Самый простой инструмент здесь может быть 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
0
ответ дан 28 August 2017 в 00:31

(Повторное использование элегантного примера из @ByteCommander:)

awk '1; NR==5 {system("cat b.txt")}' a.txt
0
ответ дан 28 August 2017 в 00:31

Другие вопросы по тегам:

Похожие вопросы: