Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Работа в консоли Linux

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 могут справиться с поставленной задачей не хуже. Если вы знаете простое решение, пожалуйста, поделитесь с нами в комментариях.