SED предоставляет два специальных символа, которые рассматриваются как команды. Эта глава иллюстрирует использование этих двух специальных символов.
= Команда
Команда «=» имеет дело с номерами строк. Ниже приведен синтаксис команды «=»:
[/ Шаблон /] = [ADDRESS1 [, адрес2]] =
Команда = записывает номер строки и ее содержимое в стандартный поток вывода. Следующий пример иллюстрирует это.
[jerry]$ sed '=' books.txt
Выполнив приведенный выше код, вы получите следующий результат:
1 1) Буря мечей, Джордж Р. Р. Мартин, 1216 2 2) Две башни, JRR Толкиен, 352 3 3) Алхимик, Пауло Коэльо, 197 4 4) Братство Кольца, JRR Толкиен, 432 5 5) Паломничество, Пауло Коэльо, 288 6 6) Игра престолов, Джордж Р. Р. Мартин, 864
Напечатаем номера строк и содержимое первых четырех строк. Следующая команда печатает первые четыре строки с номерами строк, а остальные — без номеров строк.
[jerry]$ sed '1, 4=' books.txt
Выполнив приведенный выше код, вы получите следующий результат:
1 1) Буря мечей, Джордж Р. Р. Мартин, 1216 2 2) Две башни, JRR Толкиен, 352 3 3) Алхимик, Пауло Коэльо, 197 4 4) Братство Кольца, JRR Толкиен, 432 5) Паломничество, Пауло Коэльо, 288 6) Игра престолов, Джордж Р. Р. Мартин, 864
Кроме того, мы можем дать команду SED печатать номера строк при успешном совпадении с образцом. В следующем примере печатается номер строки, содержащей шаблон «Пауло».
[jerry]$ sed '/Paulo/ =' books.txt
Выполнив приведенный выше код, вы получите следующий результат:
1) Буря мечей, Джордж Р. Р. Мартин, 1216 2) Две башни, JRR Толкиен, 352 3 3) Алхимик, Пауло Коэльо, 197 4) Братство Кольца, JRR Толкиен, 432 5 5) Паломничество, Пауло Коэльо, 288 6) Игра престолов, Джордж Р. Р. Мартин, 864
Можете ли вы угадать, что делает следующая команда SED?
[jerry]$ sed -n '$ =' books.txt
Выполнив приведенный выше код, вы получите следующий результат:
6
Да ты прав. Подсчитывает общее количество строк, присутствующих в файле. Давайте демистифицируем код. В разделе команд мы использовали «$ =», который печатает номер строки последней строки, за которой следует ее содержимое. Но мы также предоставили флаг -n, который подавляет печать по умолчанию буфера шаблонов. Следовательно, отображается только номер последней строки.
& Команда
SED поддерживает специальный символ &. Всякий раз, когда сопоставление с образцом завершается успешно, этот специальный символ сохраняет сопоставленный образец. Это часто используется с командой замещения. Давайте посмотрим, как мы можем использовать эту эффективную функцию.
Каждая строка в файле book.txt пронумерована. Давайте добавим слова номер книги в начале каждой строки. Следующий пример иллюстрирует это.
[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt
Выполнив приведенный выше код, вы получите следующий результат:
Книга № 1) Буря мечей, Джордж Р. Р. Мартин, 1216 Книга № 2) Две башни, JRR Толкиен, 352 Книга № 3) Алхимик, Пауло Коэльо, 197 Книга № 4) Братство Кольца, JRR Толкиен, 432 Книга № 5) Паломничество, Пауло Коэльо, 288 Книга № 6) Игра престолов, Джордж Р. Р. Мартин, 864
Этот пример очень прост. Сначала мы ищем первое вхождение цифры, которая является номером строки (именно поэтому мы использовали [[: digit:]]), и SED автоматически сохраняет сопоставленный образец в специальном символе &. На втором шаге мы вставляем слова «Номер книги» перед каждым соответствующим шаблоном, т. Е. Перед каждой строкой.
Давайте возьмем другой пример. В файле book.txt последняя цифра означает количество страниц книги. Давайте добавим «Pages =» до этого. Для этого найдите последнее вхождение цифры и замените ее на «Pages = &». Здесь & хранит соответствующий шаблон, т. Е. Количество страниц
[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt
Выполнив приведенный выше синтаксис, вы получите следующий результат:
1) Буря мечей, Джордж Р. Р. Мартин, Pages = 1216 2) Две башни, Дж.Р.Р. Толкин, Pages = 352 3) Алхимик, Пауло Коэльо, Pages = 197 4) Братство Кольца, Дж.Р.Р. Толкин, Pages = 432 5) Паломничество, Пауло Коэльо, Страницы = 288 6) Игра престолов, Джордж Р. Р. Мартин, Pages = 864
Пока помните, что [[: digit:]] * $ находит последнее вхождение цифры. В главе «Регулярные выражения» мы узнаем больше о регулярных выражениях.