Библиотека сайта rus-linux.net
Peter Leung, "Командная строка: маленькие хитрости от Linux Commando"
Как вставить текст в нужное место файла
Оригинал: How to insert a file at a specific line and columnАвтор: Peter Leung
Дата: 11 апреля 2010
Свободный перевод: Алексей Дмитриев
Дата перевода: 22 июля 2010
Нашей задачей будет вставка всего содержимого текстового файла в нужную строку и графу другого текстового файла.
Если нужно просто вставить текст после определенной строки, то с этим справится несколько команд Linux. Например, чтобы вставить содержимое файла file1.txt после второй строки файла file2.txt, подойдет любая из команд:
-
$ sed -i '2r file1.txt' file2.txt
-
$ awk '{print} NR==2 {while (getline < "file1.txt") print}' file2.txt
В отличие от команды sed, которая внесет изменения в файл file2.txt, команда awk выдаст результат на стандартный вывод (Stdout); при желании его можно переадресовать в новый файл. Это удобнее, когда не нужно изменять исходный файл. -
$ emacs -batch +3 file2.txt --insert file1.txt -f save-buffer -kill
В этом заклинании используется функция batch (группирование, пакетирование) редактора emacs. Команда открывает file2.txt на строке 3, вставляет file1.txt, сохраняет и потом закрывается. Изменения, таким образом, вносятся непосредственно в file2.txt. -
$ vi +2 file2.txt << DELIM > :r file1.txt > :wq > DELIM Vim: Warning: Input is not from a terminal
Необходимо пояснить, что в командную строку вы вводите только первую строку:$ vi +2 file2.txt << DELIM
и нажимаете ENTER. Все последующие строки вы вводите уже в строку приглашения редактора vi, которая начинается со знака >.
В распоряжении Linux много утилит для работы с текстом (sed, perl, awk, cut, python), но для выполнения второй части задания ≈ поместить вставку не только в нужную строку, но и в нужную колонку текста, я не придумал ничего удобнее emacs:
$ emacs -batch -Q +2:3 file2.txt --insert file1.txt -f save-buffer -kill 2>/dev/null
Секрет в цифрах +2:3, которые приказывают редактору открыть вторую строку и 3 столбец.
Еще несколько объяснений по поводу данной команды. Опция -Q означает быстрое открытие файла. Быстрое потому, что, по умолчанию, emacs не откроет ни init, ни splash файлы. И еще: выражение в конце команды 2>/dev/null
переадресует все сообщения редактора в файл /dev/null, то есть не выводит их на экран монитора.
Я не сомневаюсь в том, что команды sed, awk или perl могут справиться с поставленной задачей не хуже. Если вы знаете простое решение, пожалуйста, поделитесь с нами в комментариях.