Учебники

Stream Editor — Краткое руководство

Stream Editor — Обзор

SED акроним расшифровывается как Stream EDitor. Это простая, но мощная утилита, которая анализирует текст и плавно преобразует его. SED был разработан в 1973–74 годах Ли Э. МакМэхоном из Bell Labs. Сегодня он работает на всех основных операционных системах.

МакМэхон написал линейно-ориентированный редактор общего назначения, который в итоге стал SED. SED заимствовал синтаксис и много полезных функций от редактора ed. С самого начала он поддерживает регулярные выражения. SED принимает входные данные из файлов, а также каналов. Кроме того, он также может принимать входные данные от стандартных входных потоков.

SED написан и поддерживается Фондом свободного программного обеспечения (FSF) и распространяется GNU / Linux. Следовательно, его часто называют GNU SED. Для начинающего пользователя синтаксис SED может показаться загадочным. Однако, как только вы ознакомитесь с его синтаксисом, вы сможете решить многие сложные задачи с помощью нескольких строк сценария SED. Это красота САС.

Типичное использование САС

SED можно использовать по-разному, например:

  • Подстановка текста,
  • Выборочная печать текстовых файлов,
  • Редактирование текстовых файлов на месте,
  • Неинтерактивное редактирование текстовых файлов и многое другое.

Stream Editor — среда

В этой главе описывается, как настроить среду SED в вашей системе GNU / Linux.

Установка с помощью диспетчера пакетов

Как правило, SED доступен по умолчанию в большинстве дистрибутивов GNU / Linux. Используйте команду, чтобы определить, присутствует ли она в вашей системе или нет. Если нет, то установите SED в GNU / Linux на основе Debian, используя менеджер пакетов apt следующим образом:

[jerry]$ sudo apt-get install sed 

После установки убедитесь, что SED доступен через командную строку.

[jerry]$ sed --versio

Выполнив приведенный выше код, вы получите следующий результат:

 sed (GNU sed) 4.2.2 
 Copyright (C) 2012 Free Software Foundation, Inc. 
 Лицензия GPLv3 +: GNU GPL версии 3 или более поздней   , 
 Это бесплатное программное обеспечение: вы можете свободно изменять и распространять его. 
 НЕ ПРЕДОСТАВЛЯЕТСЯ ГАРАНТИИ, если это разрешено законом.  
 Автор Джея Фенласона, Том Лорд, Кен Пиццини, 
 и Паоло Бонзини. 
 Домашняя страница GNU sed:   , 
 Общая помощь с использованием программного обеспечения GNU:   , 
 Сообщения об ошибках по электронной почте:   , 
 Обязательно включите слово «sed» где-нибудь в поле «Subject:».

Аналогично, чтобы установить SED в GNU / Linux на основе RPM, используйте менеджер пакетов yum следующим образом:

[root]# yum -y install sed

После установки убедитесь, что SED доступен через командную строку.

[root]# sed --version

Выполнив приведенный выше код, вы получите следующий результат:

 GNU sed версия 4.2.1 
 Copyright (C) 2009 Free Software Foundation, Inc. 
 Это бесплатное программное обеспечение;  см. источник для условий копирования.  Здесь нет 
 гарантия;  даже не для ИЗДЕЛИИ или ФИТНЕСА ДЛЯ ОСОБЕННОЙ ЦЕЛИ, 
 в степени, разрешенной законом.  
 Домашняя страница GNU sed:   , 
 Общая помощь с использованием программного обеспечения GNU:   , 
 Сообщения об ошибках по электронной почте:   , 
 Обязательно включите слово «sed» где-нибудь в поле «Subject:».

Установка из исходного кода

Поскольку GNU SED является частью проекта GNU, его исходный код доступен для бесплатной загрузки. Мы уже видели, как установить SED с помощью менеджера пакетов. Давайте теперь разберемся, как установить SED из его исходного кода.

Следующая установка применима к любому программному обеспечению GNU / Linux, а также к большинству других свободно доступных программ. Вот шаги установки:

  • Загрузите исходный код из аутентичного места. Утилита командной строки wget служит для этой цели.

Загрузите исходный код из аутентичного места. Утилита командной строки wget служит для этой цели.

[jerry]$ wget ftp://ftp.gnu.org/gnu/sed/sed-4.2.2.tar.bz2
  • Распакуйте и извлеките загруженный исходный код.

  • Распакуйте и извлеките загруженный исходный код.

    [jerry]$ tar xvf sed-4.2.2.tar.bz2 
    
  • Перейдите в каталог и запустите configure.

  • Перейдите в каталог и запустите configure.

    [jerry]$ ./configure 
    
  • После успешного завершения, configure генерирует Makefile. Чтобы скомпилировать исходный код, введите команду make .

  • После успешного завершения, configure генерирует Makefile. Чтобы скомпилировать исходный код, введите команду make .

    [jerry]$ make
    
  • Вы можете запустить тестовый набор, чтобы убедиться, что сборка чистая. Это необязательный шаг.

  • Вы можете запустить тестовый набор, чтобы убедиться, что сборка чистая. Это необязательный шаг.

    [jerry]$ make check 
    
  • Наконец, установите утилиту SED. Убедитесь, что у вас есть привилегии суперпользователя.

  • Наконец, установите утилиту SED. Убедитесь, что у вас есть привилегии суперпользователя.

    [jerry]$ sudo make install 
    

    Вот и все! Вы успешно скомпилировали и установили SED. Проверьте это, выполнив команду sed следующим образом:

    [jerry]$ sed --version
    

    Выполнив приведенный выше код, вы получите следующий результат:

     sed (GNU sed) 4.2.2 
     Copyright (C) 2012 Free Software Foundation, Inc. 
     Лицензия GPLv3 +: GNU GPL версии 3 или более поздней   , 
     Это бесплатное программное обеспечение: вы можете свободно изменять и распространять его. 
     НЕ ПРЕДОСТАВЛЯЕТСЯ ГАРАНТИИ, если это разрешено законом.  
     Автор Джея Фенласона, Том Лорд, Кен Пиццини, 
     и Паоло Бонзини. 
     Домашняя страница GNU sed:   , 
     Общая помощь с использованием программного обеспечения GNU:   , 
     Сообщения об ошибках по электронной почте:   , 
     Обязательно включите слово «sed» где-нибудь в поле «Subject:».
    

    Stream Editor — рабочий процесс

    В этой главе мы рассмотрим, как именно работает SED. Чтобы стать опытным пользователем SED, нужно знать его внутренности. SED следует простой рабочий процесс: чтение, выполнение и отображение. Следующая диаграмма изображает рабочий процесс.

    Потоковый редактор Workflow

    • Чтение : SED читает строку из входного потока (файл, канал или стандартный ввод) и сохраняет ее во внутреннем буфере, называемом буфером шаблонов .

    • Выполнить : все команды SED применяются последовательно к буферу шаблонов. По умолчанию команды SED применяются ко всем линиям (глобально), если не указана адресация строк.

    • Дисплей : отправить (измененное) содержимое в выходной поток. После отправки данных буфер шаблонов будет пуст.

    • Вышеописанный процесс повторяется до тех пор, пока файл не будет исчерпан.

    Чтение : SED читает строку из входного потока (файл, канал или стандартный ввод) и сохраняет ее во внутреннем буфере, называемом буфером шаблонов .

    Выполнить : все команды SED применяются последовательно к буферу шаблонов. По умолчанию команды SED применяются ко всем линиям (глобально), если не указана адресация строк.

    Дисплей : отправить (измененное) содержимое в выходной поток. После отправки данных буфер шаблонов будет пуст.

    Вышеописанный процесс повторяется до тех пор, пока файл не будет исчерпан.

    Указывает на заметку

    • Буфер шаблонов — это частная, в памяти, энергозависимая область хранения, используемая SED.

    • По умолчанию все команды SED применяются к буферу шаблонов, поэтому входной файл остается неизменным. GNU SED предоставляет способ изменить входной файл на месте. Мы рассмотрим это в следующих разделах.

    • Существует еще одна область памяти, называемая удерживающим буфером, которая также является частной, оперативной, оперативной областью хранения. Данные могут быть сохранены в буфере хранения для последующего извлечения. В конце каждого цикла SED удаляет содержимое буфера шаблонов, но содержимое буфера удержания остается постоянным между циклами SED. Однако команды SED не могут быть непосредственно выполнены в буфере удержания, поэтому SED позволяет перемещать данные между буфером удержания и буфером шаблона.

    • Первоначально буферы паттернов и держателей пусты.

    • Если входные файлы не предоставлены, то SED принимает входные данные из стандартного входного потока (stdin).

    • Если диапазон адресов не указан по умолчанию, то SED работает на каждой строке.

    Буфер шаблонов — это частная, в памяти, энергозависимая область хранения, используемая SED.

    По умолчанию все команды SED применяются к буферу шаблонов, поэтому входной файл остается неизменным. GNU SED предоставляет способ изменить входной файл на месте. Мы рассмотрим это в следующих разделах.

    Существует еще одна область памяти, называемая удерживающим буфером, которая также является частной, оперативной, оперативной областью хранения. Данные могут быть сохранены в буфере хранения для последующего извлечения. В конце каждого цикла SED удаляет содержимое буфера шаблонов, но содержимое буфера удержания остается постоянным между циклами SED. Однако команды SED не могут быть непосредственно выполнены в буфере удержания, поэтому SED позволяет перемещать данные между буфером удержания и буфером шаблона.

    Первоначально буферы паттернов и держателей пусты.

    Если входные файлы не предоставлены, то SED принимает входные данные из стандартного входного потока (stdin).

    Если диапазон адресов не указан по умолчанию, то SED работает на каждой строке.

    Примеры

    Давайте создадим текстовый файл quote.txt, содержащий цитату известного автора Пауло Коэльо.

     [Джерри] $ vi quote.txt 
     Есть только одна вещь, которая делает мечту невозможной: страх неудачи. 
      - Пауло Коэльо, Алхимик
    

    Чтобы понять рабочий процесс SED, давайте отобразим содержимое файла quote.txt с помощью SED. Этот пример имитирует команду cat .

    [jerry]$ sed '' quote.txt
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     Есть только одна вещь, которая делает мечту невозможной: страх неудачи. 
    

    В приведенном выше примере quote.txt — это имя входного файла, а перед этим есть пара одинарных кавычек, которая подразумевает команду SED. Давайте демистифицируем эту операцию.

    Сначала SED читает строку из входного файла quote.txt и сохраняет ее в своем буфере шаблонов. Затем он применяет команды SED к шаблону буфера. В нашем случае нет никаких команд SED, следовательно, никакая операция не выполняется над буфером шаблона. Наконец, он удаляет и печатает содержимое буфера шаблонов на стандартном выходе. Разве это не просто?

    В следующем примере SED принимает ввод из стандартного потока ввода.

    [jerry]$ sed '' 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     Есть только одна вещь, которая делает мечту невозможной: страх неудачи. 
     Есть только одна вещь, которая делает мечту невозможной: страх неудачи.
    

    Здесь первая строка вводится через клавиатуру, а вторая — вывод, генерируемый SED. Чтобы выйти из сеанса SED, нажмите Ctrl-D (^ D).

    Stream Editor — основной синтаксис

    В этой главе представлены основные команды, которые поддерживает SED, и их синтаксис командной строки. SED может быть вызван в следующих двух формах:

    sed [-n] [-e] 'command(s)' files 
    sed [-n] -f scriptfile files
    

    Первая форма позволяет указывать команды в строке, и они заключены в одинарные кавычки. Последнее позволяет указать файл сценария, который содержит команды SED. Тем не менее, мы можем использовать обе формы вместе несколько раз. SED предоставляет различные параметры командной строки для управления ее поведением.

    Давайте посмотрим, как мы можем указать несколько команд SED. SED предоставляет команду удаления для удаления определенных строк. Удалим 1-ю, 2-ю и 5-ю строки. В данный момент игнорируйте все детали команды удаления. Мы обсудим больше о команде удаления позже.

    Сначала отобразите содержимое файла с помощью команды cat .

    [jerry]$ cat books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Теперь поручите САС удалить только определенные строки. Здесь, чтобы удалить три строки, мы указали три отдельные команды с опцией -e.

    [jerry]$ sed -e '1d' -e '2d' -e '5d' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Кроме того, мы можем написать несколько команд SED в текстовом файле и предоставить текстовый файл в качестве аргумента SED. SED может применять каждую команду в буфере шаблонов. Следующий пример иллюстрирует вторую форму SED.

    Сначала создайте текстовый файл, содержащий команды SED. Для простоты понимания давайте использовать те же команды SED.

    [jerry]$ echo -e "1d\n2d\n5d" > commands.txt 
    [jerry]$ cat commands.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1d 
     2d 
     5d 
    

    Теперь проинструктируйте SED читать команды из текстового файла. Здесь мы достигаем того же результата, что и в приведенном выше примере.

    [jerry]$ sed -f commands.txt books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Стандартные варианты

    SED поддерживает следующие стандартные опции:

    • -n: печать по умолчанию буфера шаблонов. Например, следующая команда SED не показывает никаких выходных данных:

    -n: печать по умолчанию буфера шаблонов. Например, следующая команда SED не показывает никаких выходных данных:

    [jerry]$ sed -n '' quote.txt 
    
  • -e : Следующий аргумент — команда редактирования. Здесь угловые скобки подразумевают обязательный параметр. Используя эту опцию, мы можем указать несколько команд. Давайте напечатаем каждую строку дважды:

  • -e : Следующий аргумент — команда редактирования. Здесь угловые скобки подразумевают обязательный параметр. Используя эту опцию, мы можем указать несколько команд. Давайте напечатаем каждую строку дважды:

    [jerry]$ sed -e '' -e 'p' quote.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Есть только одна вещь, которая делает мечту невозможной: страх неудачи. 
     Есть только одна вещь, которая делает мечту невозможной: страх неудачи. 
      - Пауло Коэльо, Алхимик 
      - Пауло Коэльо, Алхимик
    
    • -f : Следующий аргумент — это файл, содержащий команды редактирования. Угловые скобки подразумевают обязательный параметр. В следующем примере мы указываем команду печати через файл:

    -f : Следующий аргумент — это файл, содержащий команды редактирования. Угловые скобки подразумевают обязательный параметр. В следующем примере мы указываем команду печати через файл:

    [jerry]$ echo "p" > commands 
    [jerry]$ sed -n -f commands quote.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Есть только одна вещь, которая делает мечту невозможной: страх неудачи. 
      - Пауло Коэльо, Алхимик
    

    Специальные параметры GNU

    Давайте быстро пройдемся по конкретным опциям SED в GNU. Обратите внимание, что эти параметры специфичны для GNU; и может не поддерживаться другими вариантами САС. В последующих разделах мы обсудим эти варианты более подробно.

    • -n, —quiet, —silent: То же, что и стандартная опция -n.

    • -e скрипт, —expression = скрипт: То же, что и стандартная опция -e.

    • -f файл-сценария, —file = файл-сценария: То же, что и стандартная опция -f.

    • —follow-symlinks: если эта опция включена, SED следует по символическим ссылкам при редактировании файлов на месте.

    • -i [SUFFIX], —in-place [= SUFFIX]: эта опция используется для редактирования файла на месте. Если указан суффикс, он создает резервную копию исходного файла, в противном случае он перезаписывает исходный файл.

    • -l N, —line-lenght = N: эта опция устанавливает длину строки для команды l равной N символам.

    • —posix: эта опция отключает все расширения GNU.

    • -r, —regexp-extended: эта опция позволяет использовать расширенные регулярные выражения вместо базовых регулярных выражений.

    • -u, —unbuffered: Когда эта опция включена, SED загружает минимальный объем данных из входных файлов и чаще очищает выходные буферы. Это полезно для редактирования вывода «tail -f», когда вы не хотите ждать вывода.

    • -z, —null-data: по умолчанию SED разделяет каждую строку символом новой строки. Если указана опция NULL-data, она разделяет строки символами NULL.

    -n, —quiet, —silent: То же, что и стандартная опция -n.

    -e скрипт, —expression = скрипт: То же, что и стандартная опция -e.

    -f файл-сценария, —file = файл-сценария: То же, что и стандартная опция -f.

    —follow-symlinks: если эта опция включена, SED следует по символическим ссылкам при редактировании файлов на месте.

    -i [SUFFIX], —in-place [= SUFFIX]: эта опция используется для редактирования файла на месте. Если указан суффикс, он создает резервную копию исходного файла, в противном случае он перезаписывает исходный файл.

    -l N, —line-lenght = N: эта опция устанавливает длину строки для команды l равной N символам.

    —posix: эта опция отключает все расширения GNU.

    -r, —regexp-extended: эта опция позволяет использовать расширенные регулярные выражения вместо базовых регулярных выражений.

    -u, —unbuffered: Когда эта опция включена, SED загружает минимальный объем данных из входных файлов и чаще очищает выходные буферы. Это полезно для редактирования вывода «tail -f», когда вы не хотите ждать вывода.

    -z, —null-data: по умолчанию SED разделяет каждую строку символом новой строки. Если указана опция NULL-data, она разделяет строки символами NULL.

    Редактор потока — циклы

    Как и другие языки программирования, SED также предоставляет возможность создания циклов и ветвлений для управления потоком выполнения. В этой главе мы собираемся больше узнать о том, как использовать циклы и ветви в SED.

    Цикл в SED работает аналогично оператору goto . SED может перейти к строке, помеченной меткой, и продолжить выполнение оставшихся команд. В SED мы можем определить метку следующим образом:

    :label 
    :start 
    :end 
    :up
    

    В приведенном выше примере имя после двоеточия (:) подразумевает имя метки.

    Чтобы перейти к определенной метке, мы можем использовать команду b, за которой следует имя метки. Если имя метки опущено, то SED переходит в конец файла SED.

    Давайте напишем простой SED-скрипт для понимания циклов и ветвей. В нашем файле books.txt есть несколько записей названий книг и их авторов. В следующем примере название книги и имя автора объединяются в одну строку, разделенные запятой. Затем он ищет шаблон «Пауло». Если шаблон совпадает, он печатает дефис (-) перед строкой, в противном случае он переходит к метке печати, которая печатает строку.

    [jerry]$ sed -n ' 
    h;n;H;x 
    s/\n/, / 
    /Paulo/!b Print 
    s/^/- / 
    :Print 
    p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей, Джордж Р. Р. Мартин 
     Две башни, Дж. Р. Р. Толкиен 
     - Алхимик Пауло Коэльо 
     Братство Кольца, JRR Толкиен 
     - Паломничество, Пауло Коэльо
    
     Игра престолов, Джордж Р. Р. Мартин 
    

    На первый взгляд приведенный выше скрипт может выглядеть загадочно. Позвольте нам демистифицировать это.

    • Первые две команды говорят сами за себя h; n; H; x и s / \ n /, / объединяют название книги и ее автора, разделенные запятой (,).

    • Третья команда переходит на метку Печать только в том случае, если шаблон не совпадает, в противном случае замена выполняется четвертой командой.

    • : Print — это просто имя метки, и, как вы уже знаете, p — это команда печати.

    Первые две команды говорят сами за себя h; n; H; x и s / \ n /, / объединяют название книги и ее автора, разделенные запятой (,).

    Третья команда переходит на метку Печать только в том случае, если шаблон не совпадает, в противном случае замена выполняется четвертой командой.

    : Print — это просто имя метки, и, как вы уже знаете, p — это команда печати.

    Для улучшения читабельности каждая команда SED размещается на отдельной строке. Однако можно выбрать размещение всех команд в одной строке следующим образом:

    [jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей, Джордж Р. Р. Мартин 
     Две башни, Дж. Р. Р. Толкиен 
     - Алхимик Пауло Коэльо 
     Братство Кольца, JRR Толкиен 
     - Паломничество, Пауло Коэльо 
     Игра престолов, Джордж Р. Р. Мартин
    

    Редактор потока — Филиалы

    Ветви могут быть созданы с помощью команды t. Команда t переходит на метку, только если предыдущая команда замены была успешной. Давайте возьмем тот же пример, что и в предыдущей главе, но вместо того, чтобы печатать один дефис (-), теперь мы печатаем четыре дефиса. В следующем примере показано использование команды t .

    [jerry]$ sed -n ' 
    h;n;H;x 
    s/\n/, / 
    :Loop 
    /Paulo/s/^/-/ 
    /----/!t Loop 
    p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     Буря мечей, Джордж Р. Р. Мартин 
     Две башни, Дж. Р. Р. Толкиен 
     ---- Алхимик, Пауло Коэльо 
     Братство Кольца, JRR Толкиен 
     ---- Паломничество, Пауло Коэльо 
     Игра престолов, Джордж Р. Р. Мартин
    

    В приведенном выше примере первые две команды говорят сами за себя. Третья команда определяет метку Loop . Четвертая команда добавляет дефис (-), если строка содержит строку «Paulo», а команда t повторяет процедуру до тех пор, пока в начале строки не будет четыре дефиса.

    Для улучшения читабельности каждая команда SED записана в отдельной строке. В противном случае мы можем написать однострочную SED следующим образом:

    [jerry]$ sed -n 'h;n;H;x; s/\n/, /; :Loop;/Paulo/s/^/-/; /----/!t Loop; p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     Буря мечей, Джордж Р. Р. Мартин 
     Две башни, Дж. Р. Р. Толкиен 
     ---- Алхимик, Пауло Коэльо 
     Братство Кольца, JRR Толкиен 
     ---- Паломничество, Пауло Коэльо 
     Игра престолов, Джордж Р. Р. Мартин
    

    Редактор потока — паттерн-буфер

    Одной из основных операций, которые мы выполняем над любым файлом, является отображение его содержимого. Для этой цели мы можем использовать команду print, которая печатает содержимое буфера шаблонов. Итак, давайте узнаем больше о буфере паттернов

    Сначала создайте файл, содержащий номер строки, название книги, ее автора и количество страниц. В этом уроке мы будем использовать этот файл. Вы можете использовать любой текстовый файл по своему усмотрению. Наш текстовый файл будет выглядеть так:

     [Джерри] $ vi books.txt 
     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Теперь давайте распечатаем содержимое файла.

    [jerry]$ sed 'p' books.txt
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Вы можете удивиться, почему каждая строка отображается дважды. Позвольте нам выяснить.

    Вы помните рабочий процесс САС? По умолчанию SED печатает содержимое буфера шаблонов. Кроме того, мы явно включили команду печати в наш командный раздел. Следовательно, каждая строка печатается дважды. Но не волнуйся. SED имеет опцию -n для подавления печати по умолчанию буфера шаблонов. Следующая команда иллюстрирует это.

    [jerry]$ sed -n 'p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Поздравляем! мы получили ожидаемый результат. По умолчанию SED работает на всех линиях. Но мы можем заставить SED работать только на определенных линиях. Например, в приведенном ниже примере SED работает только на 3-й строке. В этом примере мы указали диапазон адресов перед командой SED.

    [jerry]$ sed -n '3p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     3) Алхимик, Пауло Коэльо, 197 
    

    Кроме того, мы также можем поручить SED печатать только определенные строки. Например, следующий код печатает все строки от 2 до 5. Здесь мы использовали оператор запятой (,) для указания диапазона адресов.

    [jerry]$ sed -n '2,5 p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288
    

    Также есть специальный символ Dollar ($), который представляет последнюю строку файла. Итак, давайте напечатаем последнюю строку файла.

    [jerry]$ sed -n '$ p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Однако мы также можем использовать символ доллара ($) для указания диапазона адресов. Ниже пример печатает через строку 3 до последней строки.

    [jerry]$ sed -n '3,$ p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     3) Алхимик, Пауло Коэльо, 197 4) Братство Кольца, JRR Толкиен, 432 5) Паломничество, Пауло Коэльо, 288 6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Мы узнали, как указать диапазон адресов с помощью оператора запятой (,). SED поддерживает еще два оператора, которые можно использовать для указания диапазона адресов. Первый — это оператор плюс (+), который можно использовать с оператором запятой (,). Например, M + n напечатает следующие n строк, начиная с номера строки M. Звучит запутанно? Давайте проверим это на простом примере. В следующем примере печатаются следующие 4 строки, начиная со строки № 2.

    [jerry]$ sed -n '2,+4 p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    При желании мы также можем указать диапазон адресов с помощью оператора тильды (~). Он использует форму M ~ n . Это указывает на то, что SED должен начинаться с номера строки M и обрабатывать каждую n (тую) строку. Например, 50 ~ 5 соответствует строке 50, 55, 60, 65 и т. Д. Давайте печатать только нечетные строки из файла.

    [jerry]$ sed -n '1~2 p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288
    

    Следующий код печатает только четные строки из файла.

    [jerry]$ sed -n '2~2 p' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат.

     2) Две башни, JRR Толкиен, 352 
     4) Братство Кольца, JRR Толкиен, 432 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Редактор потока — диапазон шаблонов

    В предыдущей главе мы узнали, как SED обрабатывает диапазон адресов. В этой главе рассказывается, как SED заботится о диапазоне шаблонов. Диапазон шаблонов может быть простым текстом или сложным регулярным выражением. Давайте возьмем пример. В следующем примере печатаются все книги автора Пауло Коэльо.

    [jerry]$ sed -n '/Paulo/ p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288
    

    В приведенном выше примере SED работает с каждой строкой и печатает только те строки, которые соответствуют строке Paulo.

    Мы также можем комбинировать диапазон шаблонов с диапазоном адресов. В следующем примере печатаются строки, начиная с первого совпадения Алхимика и заканчивая пятой строкой.

    [jerry]$ sed -n '/Alchemist/, 5 p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288
    

    Мы можем использовать символ доллара ($), чтобы напечатать все строки после нахождения первого вхождения шаблона. В следующем примере выполняется поиск первого вхождения шаблона и сразу выводятся оставшиеся строки из файла.

    [jerry]$ sed -n '/The/,$ p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Мы также можем указать более одного диапазона шаблонов, используя оператор запятой (,). В следующем примере печатаются все линии, существующие между шаблонами Два и Паломничество.

    [jerry]$ sed -n '/Two/, /Pilgrimage/ p' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288
    

    Кроме того, мы можем использовать оператор плюс (+) в пределах диапазона шаблона. Следующий пример находит первое вхождение шаблона Two и печатает следующие 4 строки после этого.

    [jerry]$ sed -n '/Two/, +4 p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Мы привели здесь только несколько примеров, чтобы познакомить вас с SED. Вы всегда можете узнать больше, попробовав несколько примеров самостоятельно.

    Редактор потока — Основные команды

    Эта глава описывает несколько полезных команд SED.

    Удалить команду

    SED предоставляет различные команды для работы с текстом. Давайте сначала рассмотрим команду удаления . Вот как вы выполняете команду удаления:

    [address1[,address2]]d 
    

    address1 и address2 — это соответственно начальный и конечный адреса, которые могут быть номерами строк или шаблонами. Оба эти адреса являются необязательными параметрами.

    Как следует из названия, команда delete используется для выполнения операции удаления, и, поскольку SED работает в режиме онлайн, мы можем сказать, что эта команда используется для удаления строк. Обратите внимание, что команда delete удаляет строки только из буфера шаблонов; строка не отправляется в выходной поток, а исходный файл остается без изменений. Следующий пример иллюстрирует суть.

    [jerry]$ sed 'd' books.txt 
    

    Но где выход? Если адрес строки не указан, то SED по умолчанию работает с каждой строкой. Следовательно, он удаляет все строки из буфера шаблонов. Вот почему команда ничего не выводит на стандартный вывод.

    Давайте проинструктируем SED работать только на определенных линиях. В следующем примере удаляется только 4-я строка.

    [jerry]$ sed '4d' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Кроме того, SED также принимает диапазон адресов, используя запятую (,). Мы можем дать команду SED удалить строки от N1 до N2. Например, в следующем примере удаляются все строки со 2 по 4.

    [jerry]$ sed '2, 4 d' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Диапазон адресов SED не ограничивается только номерами. Мы также можем указать шаблоны в качестве адреса. В следующем примере удаляются все книги автора Пауло Коэльо.

    [jerry]$ sed '/Paulo Coelho/d' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     4) Братство Кольца, JRR Толкиен, 432 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Мы также можем указать диапазон адресов, используя текстовый шаблон. В следующем примере удаляются все линии между шаблонами Storm и Fellowship .

     [Джерри] $ sed '/ Storm /, / Fellowship / d' books.txt  
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    В дополнение к этому, мы также можем использовать операторы доллара ($), плюс (+) и тильды (~) с SED.

    Написать команду

    Одной из важных операций, которые мы выполняем над любым файлом, является резервное копирование, т. Е. Мы делаем еще одну копию файла. SED предоставляет команду записи для хранения содержимого буфера шаблонов в файле. Ниже приведен синтаксис команды write , аналогичный команде delete .

    [address1[,address2]]w file 
    

    Здесь address1 и address2 являются соответственно начальным и конечным адресами, которые могут быть номерами строк или шаблонами. Оба эти адреса являются необязательными параметрами.

    В приведенном выше синтаксисе w относится к команде записи, а file — это имя файла, в котором вы храните содержимое. Будьте осторожны с параметром файла . Когда указано имя файла, SED создает файл на лету, если он отсутствует, и перезаписывает его, если он уже существует.

    Давайте сделаем точную копию файла, используя SED. Обратите внимание, что между w и файлом должен быть ровно один пробел.

    [jerry]$ sed -n 'w books.bak' books.txt 
    

    Мы создали еще один файл с именем books.bak. Теперь убедитесь, что оба файла имеют одинаковое содержимое.

    [jerry]$ diff books.txt books.bak  
    [jerry]$ echo $?
    

    Выполнив приведенный выше код, вы получите следующий результат:

     0
    

    Вы можете предположить, что команда cp делает то же самое. Да! Команда cp делает то же самое, но SED — зрелая утилита. Позволяет создать файл, содержащий только определенные строки из исходного файла. Давайте хранить только четные строки в другом файле.

    [jerry]$ sed -n '2~2 w junk.txt' books.txt  
    [jerry]$ cat junk.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     2) Две башни, JRR Толкиен, 352 
     4) Братство Кольца, JRR Толкиен, 432 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Вы также можете использовать операторы запятой (,), доллара ($) и плюс (+) с командой записи.

    В дополнение к этому, SED также поддерживает сопоставление с шаблоном с помощью команды записи. Предположим, вы хотите сохранить все книги отдельных авторов в отдельном файле. Один скучный и длительный способ — сделать это вручную, а более разумный способ — использовать SED.

    [jerry]$ sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w 
    Tolkien.txt' books.txt 
    

    В приведенном выше примере мы сопоставляем каждую строку с шаблоном и сохраняем совпавшую строку в определенном файле. Это очень просто. Чтобы указать несколько команд, мы использовали ключ -e команды SED. Теперь давайте посмотрим, что содержит каждый файл:

    [jerry]$ cat Martin.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Давайте покажем содержимое файла.

    [jerry]$ cat Paulo.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288 
    

    Давайте покажем содержимое файла.

    [jerry]$ cat Tolkien.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     2) Две башни, JRR Толкиен, 352 
     4) Братство Кольца, JRR Толкиен, 432 
    

    Отлично! Мы получили ожидаемый результат. САС действительно удивительная утилита.

    Добавить команду

    Одной из наиболее полезных операций любого текстового редактора является предоставление функциональности добавления. SED поддерживает эту операцию с помощью команды добавления. Ниже приведен синтаксис добавления:

     [Адрес] а \ 
     Добавить текст 
    

    Давайте добавим новую запись в книгу после строки № 4. В следующем примере показано, как это сделать.

    [jerry]$ sed '4 a 7) Adultry, Paulo Coelho, 234' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     7) Взрослый, Пауло Коэльо, 234 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    В разделе команд 4 означает номер строки, a — команда добавления, а оставшаяся часть — текст, который нужно добавить.

    Давайте вставим текстовую строку в конец файла. Для этого используйте $ в качестве адреса. Следующий пример иллюстрирует это:

    [jerry]$ sed '$ a 7) Adultry, Paulo Coelho, 234' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
     7) Взрослый, Пауло Коэльо, 234 
    

    Помимо номера строки, мы также можем указать адрес, используя текстовый шаблон. Например, в следующем примере текст добавляется после сопоставления строки «Алхимик» .

    [jerry]$ sed '/The Alchemist/ a 7) Adultry, Paulo Coelho, 234' books.txt  
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     7) Взрослый, Пауло Коэльо, 234 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Обратите внимание, что если существует несколько подходящих шаблонов, текст добавляется после каждого соответствия. Следующий пример иллюстрирует этот сценарий.

    [jerry]$ sed '/The/ a 7) Adultry, Paulo Coelho, 234' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     7) Взрослый, Пауло Коэльо, 234 
     3) Алхимик, Пауло Коэльо, 197 
     7) Взрослый, Пауло Коэльо, 234 
     4) Братство Кольца, JRR Толкиен, 432 
     7) Взрослый, Пауло Коэльо, 234 
     5) Паломничество, Пауло Коэльо, 288 
     7) Взрослый, Пауло Коэльо, 234 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Изменить команду

    SED предоставляет команду изменить или заменить, которая представлена ​​c. Эта команда помогает заменить существующую строку новым текстом. Если указан диапазон строк, все строки заменяются группой одной текстовой строкой. Ниже приведен синтаксис команды изменения:

     [Address1 [, address2]] с \ 
     Заменить текст
    

    Заменим третью строку другим текстом.

    [jerry]$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Взрослый, Пауло Коэльо, 324 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    САС также принимает шаблоны в качестве адреса. В следующем примере строка заменяется при успешном совпадении с шаблоном.

    [jerry]$ sed '/The Alchemist/ c 3) Adultry, Paulo Coelho, 324' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Взрослый, Пауло Коэльо, 324 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    SED также позволяет заменять несколько строк одной строкой. Следующий пример удаляет строки с четвертого по шестой и заменяет их новым текстом.

    [jerry]$ sed '4, 6 c 4) Adultry, Paulo Coelho, 324' books.txt  
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Взрослый, Пауло Коэльо, 324
    

    Вставить команду

    Команда вставки работает так же, как и команда добавления. Единственное отличие состоит в том, что он вставляет строку перед определенной позицией. Ниже приведен синтаксис команды вставки:

     [Адрес] я \ 
     Вставить текст 
    

    Давайте разберем команду вставки с некоторыми примерами. Следующая команда вставляет новую запись перед четвертой строкой.

    [jerry]$ sed '4 i 7) Adultry, Paulo Coelho, 324' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     7) Взрослый, Пауло Коэльо, 324 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    В приведенном выше примере 4 — это номер местоположения, i подразумевает команду вставки, а оставшаяся часть — текст для вставки.

    Чтобы вставить текст в начало файла, укажите адрес строки как 1 . Следующая команда иллюстрирует это:

    [jerry]$ sed '1 i 7) Adultry, Paulo Coelho, 324' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     7) Взрослый, Пауло Коэльо, 324 
    
     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Кроме того, мы можем вставить несколько строк. Следующая команда вставляет две строки перед последней строкой.

    [jerry]$ sed '$ i 7) Adultry, Paulo Coelho, 324
    

    Выполнив приведенный выше код, вы получите следующий результат:

     8) Одиннадцать минут, Пауло Коэльо, 304 'books.txt 
     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     7) Взрослый, Пауло Коэльо, 324 
     8) Одиннадцать минут, Пауло Коэльо, 304 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Обратите внимание, что вводимые записи вводятся в отдельных строках и разделяются символом обратной косой черты (\).

    Команда Перевести

    SED предоставляет команду для перевода символов и представляется как y . Преобразует персонажей по позиции. Ниже приведен синтаксис команды перевода:

     [Адрес1 [, адрес2]] у / список-1 / список-2 /
    

    Обратите внимание, что перевод основан на положении символа из списка 1 для символа в той же позиции в списке 2, и оба списка должны быть явными списками символов. Регулярные выражения и классы символов не поддерживаются. Кроме того, размер списка 1 и списка 2 должен быть одинаковым.

    В следующем примере арабские числа преобразуются в римские.

    [jerry]$ echo "1 5 15 20" | sed 'y/151520/IVXVXX/' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     IV IV XX 
    

    я командую

    Можете ли вы различить слова, разделенные пробелами, и слова, разделенные символами табуляции, только взглянув на них? Конечно, нет. Но САС может сделать это для вас. SED использует команду l для отображения скрытых символов в тексте. Например, символ табуляции с \ t и конец строки с символом $ . Ниже приведен синтаксис команды l .

     [ADDRESS1 [, адрес2]] л 
     [address1 [, address2]] l [len] 
    

    Давайте создадим файл с символами табуляции для демонстрации. Для простоты мы будем использовать один и тот же файл, просто заменив пробелы символами табуляции. Подождите! Но как это сделать — открыв файл в текстовом редакторе и заменив каждый пробел знаком табуляции? Конечно, нет! Мы можем использовать команды SED для этого.

    [jerry]$ sed 's/ /\t/g' books.txt > junk.txt 
    

    Теперь давайте отобразим скрытые символы с помощью команды l :

    [jerry]$ sed -n 'l' junk.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) \ TĀ \ tStorm \ TOF \ tSwords Джордж \ Tr. \ Tr. \ TMartin, 1216 $ 
     2) \ Tthe \ tTwo \ tTowers, J. \ Tr. \ Tr. \ TTolkien, 352 $ 
     3) \ Лобовое \ tAlchemist Пауло \ tCoelho, 197 $ 
     4) \ Tthe \ tFellowship \ TOF \ Шарль \ Тринг, J. \ Tr. \ Tr. \ TTolkien, 432 $ 
     5) \ Лобовое \ tPilgrimage Пауло \ tCoelho, 288 $ 
     6) \ TĀ \ tGame \ TOF \ tThrones Джордж \ Tr. \ Tr. \ TMartin \ т, 864 $
    

    Как и другие команды SED, он также принимает номера строк и шаблоны в качестве адреса. Вы можете попробовать это сами.

    Давайте внимательно рассмотрим еще одну интересную особенность САС. Мы можем дать команду SED выполнить перенос строк после определенного количества символов. Следующий пример переносит строки после 25 символов.

    [jerry]$ sed -n 'l 25' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря Мечей, Гео \ 
     Rge RR Martin, 1216 $ 
     2) Две башни, JR \ 
     Р. Толкиен, 352 $ 
     3) Алхимик, Пауло С \ 
     oelho, 197 $ 
     4) Братство \ 
      Кольцо, JRR Толкиен, 4 \ 
     32 $ 
     5) Паломничество, Пауло \ 
     Коэльо, 288 $ 
     6) Игра престолов, Гео \ 
     Rge RR Martin, 864 $
    

    Обратите внимание, что в приведенном выше примере предел переноса указывается после команды l. В данном случае это 25 символов. Эта опция специфична для GNU и может не работать с другими вариантами SED.

    Предел переноса, равный 0, означает, что никогда не прерывать строку, если нет символа новой строки. Следующая простая команда иллюстрирует это.

    [jerry]$ sed -n 'l 0' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 $ 
     2) Две башни, JRR Толкиен, 352 $ 
     3) Алхимик, Пауло Коэльо, 197 $ 
     4) Братство Кольца, JRR Толкиен, 432 $ 
     5) Паломничество, Пауло Коэльо, 288 $ 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 $ 
    

    Команда выхода

    Команда Quit инструктирует SED выйти из текущего потока выполнения. Он представлен командой q . Ниже приведен синтаксис команды quit:

     [Адрес] д 
     [адрес] д [значение]
    

    Обратите внимание, что команда quit не принимает диапазон адресов, она поддерживает только один адрес. По умолчанию SED выполняет чтение, выполнение и повторение рабочего процесса; но когда встречается команда quit, она просто останавливает текущее выполнение.

    Давайте напечатаем первые 3 строки из файла.

    [jerry]$ sed '3 q' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197
    

    Помимо номера строки мы также можем использовать текстовые шаблоны. Следующая команда завершается при успешном сопоставлении с образцом.

    [jerry]$ sed '/The Alchemist/ q' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197
    

    В дополнение к этому, SED также может принимать значение, которое может использоваться в качестве состояния выхода. Следующая команда показывает статус выхода как 100.

    [jerry]$ sed '/The Alchemist/ q 100' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197
    

    Теперь давайте проверим статус выхода.

    [jerry]$ echo $? 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     100
    

    Команда чтения

    Мы можем дать команду SED прочитать содержимое файла и отобразить его, когда определенное условие соответствует. Команда представлена ​​алфавитом r . Ниже приведен синтаксис команды чтения.

     [адрес] р файл
    

    Обратите внимание, что между командой r и именем файла должен быть ровно один пробел.

    Давайте разберемся с этим на простом примере. Создайте пример файла с именем junk.txt .

    [jerry]$ echo "This is junk text." > junk.txt 
    

    Следующая команда дает команду SED прочитать содержимое файла junk.txt и вставить его после третьей строки.

    [jerry]$ sed '3 r junk.txt' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     Это ненужный текст. 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    В приведенном выше примере 3 подразумевает адрес строки, r — имя команды, а junk.txt — имя файла, содержимое которого должно отображаться. Кроме того, GNU SED также принимает диапазон адресов. Например, следующая команда вставляет содержимое файла junk.txt после третьей, четвертой и пятой строк.

    [jerry]$ sed '3, 5 r junk.txt' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     Это ненужный текст. 
     4) Братство Кольца, JRR Толкиен, 432 
     Это ненужный текст. 
     5) Паломничество, Пауло Коэльо, 288 
     Это ненужный текст. 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Как и другие команды SED, команда чтения также принимает шаблон в качестве адреса. Например, следующая команда вставляет содержимое файла junk.txt при успешном совпадении с шаблоном.

    [jerry]$ sed '/Paulo/ r junk.txt' books.txt  
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     Это ненужный текст. 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     Это ненужный текст. 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Выполнить команду

    Мы можем выполнять внешние команды из SED, используя команду execute . Это представлено e . Ниже приведен синтаксис команды execute.

     [адрес1 [, адрес2]] e [команда]
    

    Давайте проиллюстрируем команду execute на простом примере. Следующая команда SED выполняет команду даты UNIX перед третьей строкой.

    [jerry]$ sed '3 e date' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     Вс 7 сентября 18:04:49 IST 2014 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Как и другие команды, он также принимает шаблоны в качестве адреса. Например, в следующем примере команда date выполняется при успешном совпадении с шаблоном. Обратите внимание, что после каждого сопоставления с шаблоном сначала выполняется команда, а затем отображается содержимое буфера шаблонов.

    [jerry]$ sed '/Paulo/ e date' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     Вс 7 сентября 18:06:04 IST 2014 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     Вс 7 сентября 18:06:04 IST 2014 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    Если вы внимательно соблюдаете синтаксис команды e , вы заметите, что эта команда является необязательной. Если после e не указана команда , она обрабатывает содержимое буфера шаблонов как внешнюю команду. Чтобы проиллюстрировать это, давайте создадим файл commands.txt с несколькими простыми командами.

    [jerry]$ echo -e "date\ncal\nuname" > commands.txt 
    [jerry]$ cat commands.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Дата 
     кал 
     uname
    

    Команды из файла говорят сами за себя. В отсутствие команды после e, SED выполняет все эти команды одну за другой. Следующий простой пример иллюстрирует это.

    [jerry]$ sed 'e' commands.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Вс 7 сентября 18:14:20 IST 2014 
        Сентябрь 2014      
     Су Мо Ту Мы Чт Ср   
         1 2 3 4 5 6   
      7 8 9 10 11 12 13   
     14 15 16 17 18 19 20   
     21 22 23 24 25 26 27   
     28 29 30               
                           
     Linux 
    

    Как и другие команды SED, команда execute также принимает все допустимые диапазоны адресов.

    Разные команды

    По умолчанию SED работает в одной строке, но может работать и в нескольких. Многострочные команды обозначаются заглавными буквами. Например, в отличие от команды n, команда N не очищает и не печатает пространство шаблона. Вместо этого он добавляет новую строку (\ n) в конец пространства текущего шаблона и добавляет следующую строку из входного файла в пространство текущего шаблона и продолжает стандартный поток операций SED, выполняя остальные команды SED. Ниже приведен синтаксис команды N

     [Адрес1 [, адрес2]] Н
    

    Давайте напечатаем разделенный запятыми список названий книг и их авторов. Следующий пример иллюстрирует это.

    [jerry]$ sed 'N; s/\n/, /g' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей, Джордж Р. Р. Мартин 
     Две башни, Дж. Р. Р. Толкиен 
     Алхимик Пауло Коэльо 
     Братство Кольца, JRR Толкиен 
     Паломничество, Пауло Коэльо 
     Игра престолов, Джордж Р. Р. Мартин
    

    Давайте разберемся, как работает приведенный выше пример. Команда N читает первую строку, т. Е. A Storm of Swords, в буфер шаблонов и добавляет \ n, а затем следующую строку. Пространство шаблонов теперь содержит «Штурм мечей» \ n Джордж Р. Р. Мартин. На следующем шаге мы заменим символ новой строки запятой.

    Как и команда p , у нас есть команда P для печати первой части (с точностью до встроенной новой строки) пространства многострочного паттерна, созданного командой N. Ниже приведен синтаксис команды P , аналогичный команде p .

     [адрес1 [, адрес2]] Р 
    

    В предыдущем примере мы увидели, что команда N создает разделенный новой строкой список названий книг и их авторов. Напечатаем только первую его часть, т. Е. Только названия книги. Следующая команда иллюстрирует это.

    [jerry]$ sed -n 'N;P' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей 
     Две башни 
     Алхимик 
     Братство кольца 
     Паломничество 
     Игра престолов
    

    Обратите внимание, что при отсутствии N он ведет себя так же, как и команда p . Следующая простая команда иллюстрирует этот сценарий.

    [jerry]$ sed -n 'P' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей 
     Джордж Р. Р. Мартин 
     Две башни 
     JRR Толкин 
     Алхимик 
     Пауло Коэльо 
     Братство кольца 
     JRR Толкин 
     Паломничество 
     Пауло Коэльо 
     Игра престолов 
     Джордж Р. Р. Мартин
    

    В дополнение к этому, SED также предоставляет команду v, которая проверяет версию. Если указанная версия больше установленной версии SED, выполнение команды завершится неудачно. Обратите внимание, что эта опция специфична для GNU и может не работать с другими вариантами SED. Ниже приведен синтаксис команды v .

     [адрес1 [, адрес2]] v [версия]
    

    Сначала узнайте текущую версию САС.

    [jerry]$ sed --version 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     sed (GNU sed) 4.2.2 
    

    В следующем примере версия SED больше, чем версия 4.2.2, поэтому команда SED прерывает свое выполнение.

    [jerry]$ sed 'v 4.2.3' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     sed: -e выражение # 1, char 7: ожидается более новая версия sed
    

    Но если предоставленная версия меньше или равна версии 4.2.2, то команда работает как положено.

    [jerry]$ sed 'v 4.2.2' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей 
     Джордж Р. Р. Мартин 
     Две башни 
     JRR Толкин 
     Алхимик 
     Пауло Коэльо 
     Братство кольца 
     JRR Толкин 
     Паломничество 
     Пауло Коэльо 
     Игра престолов Джордж Р. Р. Мартин
    

    Редактор потока — специальные символы

    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:]] * $ находит последнее вхождение цифры. В главе «Регулярные выражения» мы узнаем больше о регулярных выражениях.

    Редактор потока — Строки

    Замена команды

    Операции подстановки текста, такие как «найти и заменить», распространены в любом текстовом редакторе. В этом разделе мы иллюстрируем, как SED выполняет замену текста. Ниже приведен синтаксис команды замещения.

     [Address1 [, address2]] s / шаблон / замена / [флаги]
    

    Здесь address1 и address2 — это соответственно начальный и конечный адреса, которые могут быть номерами строк или шаблонами. Оба эти адреса являются необязательными параметрами. Шаблон — это текст, который мы хотим заменить строкой замены. Кроме того, мы можем указать дополнительные флаги с помощью SED.

    В файле books.txt мы использовали запятую (,) для разделения каждого столбца. Давайте используем вертикальную черту (|) для разделения каждого столбца. Для этого замените запятую (,) на вертикальную черту (|).

    [jerry]$ sed 's/,/ | /' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей |  Джордж Р. Р. Мартин, 1216 
     2) Две башни |  JRR Толкиен, 352 
     3) Алхимик |  Пауло Коэльо, 197 
     4) Братство Кольца |  JRR Толкиен, 432 
     5) Паломничество |  Пауло Коэльо, 288 
     6) Игра престолов |  Джордж Р. Р. Мартин, 864 
    

    Если вы внимательно наблюдаете, заменяется только первая запятая, а вторая остается такой, как есть. Зачем? Как только шаблон соответствует, SED заменяет его строкой замены и переходит на следующую строку. По умолчанию он заменяет только первое вхождение. Чтобы заменить все вхождения, используйте глобальный флаг (g) с SED следующим образом:

    [jerry]$ sed 's/,/ | /g' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей |  Джордж Р. Р. Мартин |  1216 
     2) Две башни |  JRR Толкиен |  352 
     3) Алхимик |  Пауло Коэльо |  197 
     4) Братство Кольца |  JRR Толкиен |  432 
     5) Паломничество |  Пауло Коэльо |  288 
     6) Игра престолов |  Джордж Р. Р. Мартин |  +864
    

    Теперь все вхождения запятых (,) заменены вертикальной чертой (|).

    Мы можем дать команду SED выполнить замену текста только тогда, когда совпадение с шаблоном выполнено успешно. В следующем примере запятая (,) заменяется вертикальной чертой (|) только в том случае, если строка содержит шаблон «Паломничество».

    [jerry]$ sed '/The Pilgrimage/ s/,/ | /g' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество |  Пауло Коэльо |  288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864
    

    В дополнение к этому, SED может заменить конкретное вхождение шаблона. Заменим только второй экземпляр запятой (,) на вертикальную черту (|).

    [jerry]$ sed 's/,/ | /2' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин |  1216 
     2) Две башни, Дж. Р. Р. Толкиен |  352 
     3) Алхимик Пауло Коэльо |  197 
     4) Братство Кольца, Дж. Р. Р. Толкиен |  432 
     5) Паломничество, Пауло Коэльо |  288 
     6) Игра престолов, Джордж Р. Р. Мартин |  +864
    

    В приведенном выше примере число в конце команды SED (или в месте флага) подразумевает второе вхождение.

    САС предоставляет интересную особенность. После выполнения замены SED предоставляет возможность показывать только измененные строки. Для этого SED использует флаг p, который относится к печати. В следующем примере перечислены только измененные строки.

    [jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288 
    

    Мы также можем сохранить измененные строки в другом файле. Для достижения этого результата используйте флаг w . В следующем примере показано, как это сделать.

    [jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt
    

    Мы использовали одну и ту же команду SED. Давайте проверим содержимое файла junk.txt .

    [jerry]$ cat junk.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288
    

    Для выполнения замены без учета регистра используйте флаг i, который подразумевает игнорирование регистра. В следующем примере выполняется подстановка без учета регистра.

    [jerry]$ sed  -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288
    

    До сих пор мы использовали только символ передней косой черты (/) в качестве разделителя, но мы также можем использовать вертикальную черту (|), знак (@), знак вставки (^), восклицательный знак (!) В качестве разделителя. В следующем примере показано, как использовать другие символы в качестве разделителя.

    Предположим, вам нужно заменить путь / bin / sed на /home/jerry/src/sed/sed-4.2.2/sed. Следовательно, ваша команда SED выглядит так:

    [jerry]$ echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/jerry\/src\/sed\/sed-4.2.2\/sed/'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     /home/jerry/src/sed/sed-4.2.2/sed
    

    Мы можем сделать эту команду более удобочитаемой и понятной. Давайте используем вертикальную черту (|) в качестве разделителя и посмотрим на результат.

    [jerry]$ echo "/bin/sed" | sed 's|/bin/sed|/home/jerry/src/sed/sed-4.2.2/sed|'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     /home/jerry/src/sed/sed-4.2.2/sed
    

    В самом деле! Мы получили тот же результат, и синтаксис стал более читабельным. Точно так же мы можем использовать знак «@» (@) в качестве разделителя следующим образом:

    [jerry]$ echo "/bin/sed" | sed 's@/bin/sed@/home/jerry/src/sed/sed-4.2.2/sed@'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     /home/jerry/src/sed/sed-4.2.2/sed 
    

    В дополнение к этому мы можем использовать символ вставки (^) в качестве разделителя.

    [jerry]$ echo "/bin/sed" | sed 's^/bin/sed^/home/jerry/src/sed/sed-4.2.2/sed^'
    

    Выполнив приведенный выше код, вы получите следующий результат:

    /home/jerry/src/sed/sed-4.2.2/sed 
    

    Мы также можем использовать восклицательный знак (!) В качестве разделителя следующим образом:

    [jerry]$ echo "/bin/sed" | sed 's!/bin/sed!/home/jerry/src/sed/sed-4.2.2/sed!'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     /home/jerry/src/sed/sed-4.2.2/sed 
    

    Обычно обратный слеш (/) используется в качестве разделителя, но иногда удобнее использовать другие поддерживаемые разделители с SED.

    Создание подстроки

    Мы узнали мощную команду замены. Давайте посмотрим, сможем ли мы найти подстроку из сопоставленного текста. Давайте разберемся, как это сделать с помощью примера.

    Давайте рассмотрим следующий текст:

    [jerry]$ echo "Three One Two"
    

    Предположим, мы должны организовать это в последовательности. Значит, он должен сначала напечатать Один, затем Два и, наконец, Три. Следующий однострочник делает все необходимое.

    echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'
    

    Обратите внимание, что в приведенном выше примере в качестве разделителя используется вертикальная черта (|).

    В SED подстроки могут быть указаны с помощью оператора группировки, и перед ним должен стоять префикс с escape-символом, т. Е. \ ( И \) .

    \ w — это регулярное выражение, которое соответствует любой букве, цифре или подчеркиванию, а «+» используется для соответствия более чем одному символу. Другими словами, регулярное выражение \ (\ w \ + \) соответствует одному слову из входной строки.

    Во входной строке три слова разделены пробелом, поэтому есть три регулярных выражения, разделенных пробелом. Первое регулярное выражение хранит первое слово, т. Е. Три, второе хранит слово один , а третье хранит слово два

    Эти подстроки обозначаются \ N, где N — номер подстроки. Следовательно, \ 2 печатает вторую подстроку, т.е. One; \ 3 печатает третью подстроку, т.е. Two; и \ 1 печатает первую подстроку, т.е. три

    Давайте разделим эти слова запятыми (,) и соответствующим образом изменим регулярное выражение.

    [jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Один два три
    

    Обратите внимание, что теперь в регулярном выражении есть запятая (,) вместо пробела.

    Флаги замены строки (только GNU SED)

    В предыдущем разделе мы видели несколько примеров команды замещения. GNU SED предоставляет некоторые специальные escape-последовательности, которые можно использовать в строке замены. Обратите внимание, что эти флаги замены строк специфичны для GNU и могут не работать с другими вариантами SED. Здесь мы обсудим флаги замены строк.

    • \ L: если в строке замены указано \ L, все оставшиеся символы слова после \ L обрабатываются строчными буквами. Например, символы «ULO» обрабатываются как строчные буквы.

    \ L: если в строке замены указано \ L, все оставшиеся символы слова после \ L обрабатываются строчными буквами. Например, символы «ULO» обрабатываются как строчные буквы.

    [jerry]$ sed -n 's/Paulo/PA\LULO/p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197
     5) Паломничество, Пауло Коэльо, 288
    
    • \ u: Когда в строке замены указан \ u, он обрабатывает непосредственный символ после \ u как символ верхнего регистра. В следующем примере \ u используется перед символами «a» и «o». Следовательно, SED рассматривает эти символы как заглавные буквы.

    \ u: Когда в строке замены указан \ u, он обрабатывает непосредственный символ после \ u как символ верхнего регистра. В следующем примере \ u используется перед символами «a» и «o». Следовательно, SED рассматривает эти символы как заглавные буквы.

    [jerry]$ sed -n 's/Paulo/p\uaul\uo/p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Поло Коэльо, 288
    
    • \ U: Когда в строке замены указано \ U, все оставшиеся символы слова после \ U считаются заглавными.

    \ U: Когда в строке замены указано \ U, все оставшиеся символы слова после \ U считаются заглавными.

    [jerry]$ sed -n 's/Paulo/\Upaulo/p' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288
    
    • \ E: Этот флаг должен использоваться с \ L или \ U. Останавливает преобразование, инициированное флагом \ L или \ U. В следующем примере только первое слово заменяется заглавными буквами.

    \ E: Этот флаг должен использоваться с \ L или \ U. Останавливает преобразование, инициированное флагом \ L или \ U. В следующем примере только первое слово заменяется заглавными буквами.

    [jerry]$ sed -n 's/Paulo Coelho/\Upaulo \Ecoelho/p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     3) Алхимик, Пауло Коэльо, 197 
     5) Паломничество, Пауло Коэльо, 288
    

    Редактор потока — Управление шаблонами

    Мы уже обсуждали использование шаблона и буфера хранения. В этой главе мы собираемся узнать больше об их использовании. Давайте обсудим команду n, которая печатает пространство шаблона. Он будет использоваться вместе с другими командами. Ниже приведен синтаксис команды n .

     [Адрес1 [, адрес2]] п
    

    Давайте возьмем пример.

    [jerry]$ sed 'n' books.txt 
    

    Когда приведенный выше код будет выполнен, он даст следующий результат:

     1) Буря мечей, Джордж Р. Р. Мартин, 1216 
     2) Две башни, JRR Толкиен, 352 
     3) Алхимик, Пауло Коэльо, 197 
     4) Братство Кольца, JRR Толкиен, 432 
     5) Паломничество, Пауло Коэльо, 288 
     6) Игра престолов, Джордж Р. Р. Мартин, 864 
    

    Команда n печатает содержимое буфера шаблонов, очищает буфер шаблонов, извлекает следующую строку в буфер шаблонов и применяет к нему команды.

    Давайте рассмотрим три команды SED до n и две команды SED после n следующим образом:

     Сед команда № 1 
     Sed команда № 2 
     Сед команда № 3 
     п команда 
     Сед команда № 4 
     Sed команда № 5
    

    В этом случае SED применяет первые три команды к буферу шаблонов, очищает буфер шаблонов, извлекает следующую строку в буфер шаблонов и затем применяет к нему четвертую и пятую команды. Это очень важная концепция. Не продолжайте, не имея ясного понимания этого.

    В буфере удержания хранятся данные, но команды SED нельзя применить непосредственно к буферу удержания. Следовательно, нам нужно перенести данные буфера хранения в буфер паттернов. SED предоставляет команду x для обмена содержимым паттернов и хранения буферов. Следующие команды иллюстрируют команду x .

    Давайте немного изменим файл books.txt. Скажем, файл содержит названия книг, за которыми следуют имена авторов. После модификации файл должен выглядеть так:

    [jerry]$ cat books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей 
     Джордж Р. Р. Мартин 
     Две башни 
     JRR Толкин 
     Алхимик 
     Пауло Коэльо 
     Братство кольца 
     JRR Толкин 
     Паломничество 
     Пауло Коэльо 
     Игра престолов 
     Джордж Р. Р. Мартин 
    

    Давайте обменяемся содержимым двух буферов. Например, в следующем примере печатаются только имена авторов.

    [jerry]$ sed -n 'x;n;p' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Джордж Р. Р. Мартин 
     JRR Толкин 
     Пауло Коэльо 
     JRR Толкин 
     Пауло Коэльо 
     Джордж Р. Р. Мартин 
    

    Давайте разберемся, как работает эта команда.

    • Первоначально SED считывает первую строку, т. Е. A Storm of Swords, в буфер шаблонов.

    • Команда x перемещает эту строку в буфер удержания.

    • n извлекает следующую строку, т. е. Джордж Р. Р. Мартин, в буфер шаблонов.

    • Управление передается команде, за которой следует n, которая печатает содержимое буфера шаблонов.

    • Процесс повторяется до тех пор, пока файл не будет исчерпан.

    Первоначально SED считывает первую строку, т. Е. A Storm of Swords, в буфер шаблонов.

    Команда x перемещает эту строку в буфер удержания.

    n извлекает следующую строку, т. е. Джордж Р. Р. Мартин, в буфер шаблонов.

    Управление передается команде, за которой следует n, которая печатает содержимое буфера шаблонов.

    Процесс повторяется до тех пор, пока файл не будет исчерпан.

    Теперь давайте обменяем содержимое буферов перед печатью. Угадай, что происходит? Да, он печатает названия книг.

    [jerry]$ sed -n 'x;n;x;p' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей 
     Две башни 
     Алхимик 
     Братство кольца 
     Паломничество 
     Игра престолов
    

    Команда h имеет дело с буфером удержания. Он копирует данные из буфера шаблонов в буфер хранения. Существующие данные из буфера хранения перезаписываются. Обратите внимание, что команда h не перемещает данные, она только копирует данные. Следовательно, скопированные данные остаются в том же виде, что и в буфере шаблонов. Ниже приведен синтаксис команды h .

     [ADDRESS1 [, адрес2]] ч 
    

    Следующая команда печатает только названия автора Пауло Коэльо.

    [jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Алхимик 
     Паломничество
    

    Давайте разберемся, как работает вышеуказанная команда. Содержимое books.txt соответствует определенному формату. Первая строка — название книги, за которой следует автор книги. В приведенной выше команде «!» используется для отмены условия, т. е. строка копируется в буфер удержания только тогда, когда совпадение с образцом не удается. И фигурные скобки {} используются для группировки нескольких команд SED

    На первом проходе команды SED считывает первую строку, т. Е. A Storm of Swords, в буфер шаблонов и проверяет, содержит ли он шаблон Paulo или нет. Поскольку сопоставление с образцом не удается, оно копирует эту строку в буфер хранения. Теперь и шаблонный буфер, и буфер хранения содержат одну и ту же строку, т. Е. A Storm of Swords. На втором этапе он проверяет, содержит ли строка паттерн Пауло или нет. Поскольку шаблон не совпадает, он ничего не делает.

    Во втором проходе он читает следующую строку George RR Martin в буфер шаблонов и применяет те же шаги. Для следующих трех строк он делает то же самое. В конце пятого прохода оба буфера содержат Алхимик. В начале шестого прохода он читает строку Paulo Coelho и, когда шаблон соответствует, не копирует эту строку в буфер удержания. Следовательно, буфер шаблонов содержит Пауло Коэльо, а буфер хранения содержит Алхимик.

    После этого он проверяет, содержит ли буфер шаблонов шаблон Paulo. Когда совпадение с шаблоном завершается успешно, оно обменивается содержимым буфера шаблона с буфером удержания. Теперь буфер шаблонов содержит The Alchemist, а буфер хранения содержит Paulo Coelho. Наконец, он печатает содержимое буфера шаблонов. Те же шаги применяются к шаблону «Паломничество».

    Команда h уничтожает предыдущее содержимое буфера удержания. Это не всегда приемлемо, так как иногда нам нужно сохранять содержимое. Для этого SED предоставляет команду H, которая добавляет содержимое в буфер удержания, добавляя новую строку в конце. Единственная разница между командами h и H состоит в том, что первая перезаписывает данные из буфера хранения, а последняя добавляет данные в буфер удержания. Его синтаксис похож на команду h .

     [Адрес1 [, адрес2]] Н
    

    Давайте возьмем другой пример. На этот раз, вместо того, чтобы печатать только названия книг, напечатайте также имена их авторов. В следующем примере печатаются заголовки книг и имена их авторов.

    [jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Алхимик 
     Пауло Коэльо 
     Паломничество
     Пауло Коэльо
    

    Мы узнали, как копировать / добавлять содержимое буфера шаблонов для хранения буфера. Можем ли мы выполнить обратную функцию? Да, конечно! Для этой цели SED предоставляет команду g, которая копирует данные из буфера хранения в буфер шаблонов. При копировании существующие данные из пространства шаблонов перезаписываются. Ниже приведен синтаксис команды g .

     [адрес1 [, адрес2]] г
    

    Давайте рассмотрим тот же пример — печать названий книг и их авторов. На этот раз мы сначала напечатаем имя автора, а на следующей строке — название книги. Следующая команда печатает имя автора Пауло Коэльо, за которым следует название книги.

    [jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Пауло Коэльо 
     Алхимик 
     Пауло Коэльо 
     Паломничество
    

    Первая команда сохраняется как есть. В конце пятого прохода оба буфера содержат Алхимик. В начале шестого прохода он читает строку Paulo Coelho и, когда шаблон соответствует, не копирует эту строку в буфер удержания. Следовательно, пространство образца содержит Пауло Коэльо, а пространство удержания содержит Алхимика.

    После этого он проверяет, содержит ли пространство шаблонов шаблон Пауло. Когда совпадение с шаблоном завершается успешно, оно сначала печатает содержимое пространства шаблонов, т. Е. Пауло Коэльо, затем копирует буфер удержания в буфер шаблонов. Следовательно, и паттерны паттернов и держатели содержат The Alchemist. Наконец, он печатает содержимое буфера шаблонов. Те же шаги применяются к шаблону «Паломничество».

    Точно так же мы можем добавить содержимое буфера хранения в буфер паттернов. SED предоставляет команду G, которая добавляет содержимое в буфер шаблонов, добавляя новую строку в конце.

     [адрес1 [, адрес2]] G
    

    Теперь давайте возьмем предыдущий пример, в котором напечатано имя автора Пауло Коэльхоф, которое называется названием книги. Для достижения того же результата выполните следующую команду SED.

    [jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Пауло Коэльо 
     Алхимик 
     Пауло Коэльо 
     Паломничество
    

    Можете ли вы изменить приведенный выше пример для отображения названий книг, за которыми следуют их авторы? Просто, просто поменяйте содержимое буфера перед командой G.

    [jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Алхимик 
     Пауло Коэльо 
     Паломничество 
     Пауло Коэльо 
    

    Stream Editor — Регулярные выражения

    Именно регулярные выражения делают SED мощным и эффективным. Ряд сложных задач можно решить с помощью регулярных выражений. Любой эксперт командной строки знает силу регулярных выражений.

    Как и многие другие утилиты GNU / Linux, SED также поддерживает регулярные выражения, которые часто называют регулярными выражениями . Эта глава подробно описывает регулярные выражения. Глава разделена на три раздела: стандартные регулярные выражения, классы регулярных выражений POSIX и мета-символы.

    Стандартные регулярные выражения

    Начало строки (^)

    В терминологии регулярных выражений символ каретки (^) соответствует началу строки. В следующем примере печатаются все строки, начинающиеся с шаблона «The».

    [jerry]$ sed -n '/^The/ p' books.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Две башни, Дж. Р. Р. Толкиен 
     Алхимик Пауло Коэльо 
     Братство Кольца, JRR Толкиен 
     Паломничество, Пауло Коэльо
    

    Конец строки ($)

    Конец строки представлен символом доллара ($). В следующем примере печатаются строки, оканчивающиеся на «Coelho».

    [jerry]$ sed -n '/Coelho$/ p' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Алхимик Пауло Коэльо 
     Паломничество, Пауло Коэльо
    

    Один символ (.)

    Точка (.) Соответствует любому отдельному символу, кроме символа конца строки. В следующем примере печатаются все трехбуквенные слова, заканчивающиеся символом «t».

    [jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     кошка 
     летучая мышь 
     крыса 
     мат
    

    Совпадение символов ([])

    В терминологии регулярных выражений набор символов представлен квадратными скобками ([]). Используется для соответствия только одному из нескольких символов. В следующем примере сопоставляются шаблоны «Call» и «Tall», но не «Ball».

    [jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Вызов 
     высокий
    

    Эксклюзивный набор ([^])

    В эксклюзивном наборе каретка отменяет набор символов в квадратных скобках. В следующем примере печатается только «Ball».

    [jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Мяч 
    

    Диапазон символов ([-])

    Если указан диапазон символов, регулярное выражение соответствует любому символу в диапазоне, указанном в квадратных скобках. Следующий пример соответствует «Call» и «Tall», но не «Ball».

    [jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Вызов 
     высокий
    

    Теперь давайте изменим диапазон на «AP» и посмотрим на результат.

    [jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Вызов 
     Мяч
    

    Ноль на одно вхождение (\?)

    В SED знак вопроса (\?) Соответствует нулю или одному вхождению предшествующего символа. Следующий пример соответствует «Поведению», а также «Поведению». Здесь мы сделали «u» необязательным символом, используя «\?».

    [jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Поведение 
     Поведение
    

    Одно или несколько вхождений (\ +)

    В SED символ плюс (\ +) соответствует одному или нескольким вхождениям предыдущего символа. В следующем примере показано одно или несколько вхождений «2».

    [jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     22 
     123 
     234 
     222 
    

    Ноль или более вхождение (*)

    Звездочки (*) соответствуют нулю или более вхождению предыдущего символа. Следующий пример соответствует «ca», «cat», «catt» и так далее.

    [jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Калифорния 
     кошка 
    

    Точно N вхождений {n}

    {n} точно соответствует «n» вхождению предыдущего символа. В следующем примере печатаются только трехзначные числа. Но перед этим вам нужно создать следующий файл, который содержит только цифры.

    [jerry]$ cat numbers.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1 
     10 
     100 
     1000 
     10000 
     100000 
     1000000 
     10000000 
     100000000 
     1000000000
    

    Давайте напишем выражение SED.

    [jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     100
    

    Обратите внимание, что пара фигурных скобок экранируется символом «\».

    По крайней мере, n вхождений {n,}

    {n,} соответствует как минимум «n» вхождению предыдущего символа. В следующем примере печатаются все числа, большие или равные пяти цифрам.

    [jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     10000 
     100000 
     1000000
     10000000 
     100000000 
     1000000000 
    

    M к N Вхождение {m, n}

    {m, n} соответствует как минимум «m» и не более «n» вхождений предыдущего символа. В следующем примере печатаются все числа, имеющие не менее пяти цифр, но не более восьми цифр.

    [jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     10000 
     100000 
     1000000 
     10000000 
    

    Труба (|)

    В SED символ канала ведет себя как логическая операция ИЛИ. Это соответствует пунктам с любой стороны трубы. Следующий пример соответствует либо «str1», либо «str3».

    [jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     str1 
     str3
    

    Обратите внимание, что пара скобок и pipe (|) экранируются символом «\».

    Убегающие персонажи

    Есть определенные специальные символы. Например, символ новой строки представлен символом «\ n», возврат каретки представлен символом «\ r» и т. Д. Чтобы использовать эти символы в обычном контексте ASCII, мы должны экранировать их, используя символ обратной косой черты (\). Эта глава иллюстрирует экранирование специальных символов.

    Спасаясь «\»

    Следующий пример соответствует шаблону «\».

    [jerry]$ echo 'str1\str2' | sed -n '/\\/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     str1 \ str2 
    

    Экранирование «\ n»

    Следующий пример соответствует символу новой строки.

    [jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     str1 \ nstr2
    

    Бегство «г»

    Следующий пример соответствует возврату каретки.

    [jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     str1 \ rstr2
    

    Бегство «\ dnnn»

    Это соответствует символу, десятичное значение ASCII которого равно «nnn». В следующем примере соответствует только символ «а».

    [jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

    
    

    Бегство «\ onnn»

    Это соответствует символу, восьмеричное значение ASCII которого равно «nnn». Следующий пример соответствует только символу «b».

    [jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     б 
    

    Это соответствует символу, шестнадцатеричное значение ASCII которого равно «nnn». Следующий пример соответствует только символу «c».

    [jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     с
    

    POSIX классы регулярных выражений

    Есть определенные зарезервированные слова, которые имеют особое значение. Эти зарезервированные слова называются классами регулярных выражений POSIX. В этом разделе описываются классы POSIX, поддерживаемые SED.

    [Цифра, буква]

    Это подразумевает алфавитные и числовые символы. В следующем примере сопоставляются только «Один» и «123», но не соответствует символу табуляции.

    [jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Один 
     123
    

    [:альфа:]

    Это подразумевает только алфавитные символы. Следующий пример соответствует только слову «Один».

    [jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Один 
    

    [: Пусто:]

    Это подразумевает пустой символ, который может быть пробелом или табуляцией. Следующий пример соответствует только символу табуляции.

    [jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte
    

    Выполнив приведенный выше код, вы получите следующий результат:

     ^ I $
    

    Обратите внимание, что команда «cat -vte» используется для отображения символов табуляции (^ I).

    [: Цифры:]

    Это подразумевает только десятичные числа. В следующем примере соответствует только цифра «123».

    [jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     123 
    

    [: Нижняя:]

    Это подразумевает только строчные буквы. В следующем примере соответствует только «один».

    [jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     один 
    

    [: Верхняя:]

    Это подразумевает только заглавные буквы. Следующий пример соответствует только «ДВА».

    [jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     ДВА
    

    [Пунктуатор]

    Это подразумевает знаки препинания, которые включают не пробелы или буквенно-цифровые символы

    [jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Один два
    

    [:пространство:]

    Это подразумевает пробельные символы. Следующий пример иллюстрирует это.

    [jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     123 ^ L ^ I $ 
    

    метасимволов

    Как и традиционные регулярные выражения, SED также поддерживает метасимволы. Это регулярные выражения в стиле Perl. Обратите внимание, что поддержка метасимволов специфична для GNU SED и может не работать с другими вариантами SED. Давайте обсудим метасимволы в деталях.

    Граница слова (\ b)

    В терминологии регулярных выражений «\ b» соответствует границе слова. Например, «\ bthe \ b» соответствует «the», но не «this», «there», «они», «then» и т. Д. Следующий пример иллюстрирует это.

    [jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

    
    

    Граница без слов (\ B)

    В терминологии регулярных выражений «\ B» соответствует границе без слов. Например, «\ B» соответствует «этим» и «они», но не «the». Следующий пример иллюстрирует это.

    [jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     эти 
     Oни
    

    Один пробел (\ s)

    В SED «\ s» подразумевает один символ пробела. Следующий пример соответствует «Line \ t1», но не соответствует «Line1».

    [jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1 
    

    Одноместный без пробелов (\ S)

    В SED «\ S» подразумевает один символ пробела. Следующий пример соответствует «Line2», но не соответствует «Line \ t1».

    [jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Line2
    

    Отдельное слово (\ w)

    В SED «\ w» подразумевает символ из одного слова, то есть буквенные символы, цифры и подчеркивание (_). Следующий пример иллюстрирует это.

    [jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Один 
     123 
     1_2
    

    Одиночный не-словесный символ (\ W)

    В SED «\ W» подразумевает один несловарный символ, который в точности противоположен «\ w». Следующий пример иллюстрирует это.

    [jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     &; #
    

    Начало шаблона пространства (\ `)

    В SED «\` «подразумевает начало пространства образца. Следующий пример соответствует только слову «Один».

    [jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p' 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Один
    

    Stream Editor — Полезные рецепты

    SED — удивительная утилита, которая позволяет несколькими способами решить проблему. Это UNIX-способ, и SED прекрасно это доказывает. GNU / Linux предоставляет много полезных утилит для выполнения повседневных задач. Давайте смоделируем несколько утилит с помощью SED. Иногда может показаться, что мы решаем легкую проблему трудным путем, но цель состоит в том, чтобы просто продемонстрировать силу САС.

    Кошачья команда

    В следующем примере каждая строка печатается как часть рабочего процесса по умолчанию.

    [jerry]$ sed '' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей, Джордж Р. Р. Мартин 
     Две башни, Дж. Р. Р. Толкиен 
     Алхимик Пауло Коэльо 
     Братство Кольца, JRR Толкиен 
     Паломничество, Пауло Коэльо 
     Игра престолов, Джордж Р. Р. Мартин 
    

    В следующем примере команда print используется для отображения содержимого файла.

    [jerry]$ sed -n 'p' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей, Джордж Р. Р. Мартин 
     Две башни, Дж. Р. Р. Толкиен 
     Алхимик Пауло Коэльо 
     Братство Кольца, JRR Толкиен 
     Паломничество, Пауло Коэльо 
     Игра престолов, Джордж Р. Р. Мартин
    

    Удаление пустых строк

    В следующем примере «^ $» подразумевает пустую строку, и пустые строки удаляются при успешном совпадении с шаблоном.

    [jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1 
     Строка № 2 
    

    Аналогично, в следующем примере строка печатается только тогда, когда она не пуста.

    [jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1 
     Строка № 2
    

    Удаление закомментированных строк из программы на C ++

    Давайте создадим пример программы на C ++.

    #include <iostream> 
    using namespace std; 
    
    int main(void) 
    { 
       // Displays message on stdout. 
       cout >> "Hello, World !!!" >> endl;  
       return 0; // Return success. 
    }
    

    Теперь удалите комментарии, используя следующее регулярное выражение.

    [jerry]$ sed 's|//.*||g' hello.cpp
    

    Выполнив приведенный выше код, вы получите следующий результат:

    #include <iostream>
    using namespace std; 
    
    int main(void) 
    { 
       cout >> "Hello, World !!!" >> endl; 
       return 0;  
    } 
    

    Добавление комментариев перед определенными строками

    В следующем примере добавляются комментарии перед номерами строк с 3 по 5.

    [jerry]$ sed '3,5 s/^/#/' hello.sh 
    

    Выполнив приведенный выше код, вы получите следующий результат:

    #!/bin/bash 
    #pwd 
    #hostname 
    #uname -a 
    who 
    who -r 
    lsb_release -a
    

    Команда wc -l

    Команда «wc -l» подсчитывает количество строк, присутствующих в файле. Следующее выражение SED имитирует то же самое.

    [jerry]$ sed -n '$ =' hello.sh 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     8 
    

    Главное командование

    По умолчанию команда head печатает первые 10 строк файла. Давайте смоделируем такое же поведение с SED.

    [jerry]$ sed '10 q' books.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Буря мечей 
     Джордж Р. Р. Мартин 
     Две башни 
     JRR Толкин 
     Алхимик 
     Пауло Коэльо 
     Братство кольца 
     JRR Толкин 
     Паломничество
     Пауло Коэльо
    

    Хвост -1 Командование

    «Хвост -1» печатает последнюю строку файла. Следующий синтаксис показывает его моделирование.

    [jerry]$ echo -e "Line #1\nLine #2" > test.txt 
    [jerry]$ cat test.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1 
     Строка № 2 
    

    Давайте напишем сценарий SED.

    [jerry]$ sed -n '$p' test.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка № 2 
    

    Команда Dos2unix

    В среде DOS символ новой строки представлен комбинацией символов CR / LF. Следующая имитация команды «dos2unix» преобразует символ новой строки DOS в символ новой строки UNIX. В GNU / Linux этот символ часто трактуется как символ «^ M» (Control M).

    [jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt 
    [jerry]$ file test.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     test.txt: текст ASCII, с ограничителями строки CRLF 
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ sed 's/^M$//' test.txt > new.txt   # Press "ctrl+v" followed "ctrl+m" to generate 
    "^M" character. 
    [jerry]$ file new.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     new.txt: текст ASCII 
    

    Теперь давайте покажем содержимое файла.

    [jerry]$ cat -vte new.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Линия № 1 $ 
     Строка № 2 $
    

    Команда Unix2dos

    Подобно «dos2unix», есть команда «unix2dos», которая преобразует символ новой строки UNIX в символ новой строки DOS. Следующий пример показывает симуляцию того же самого.

    [jerry]$ echo -e "Line #1\nLine #2" > test.txt 
    [jerry]$ file test.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     test.txt: текст ASCII
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ sed 's/$/\r/' test.txt  > new.txt 
    [jerry]$ file new.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     new.txt: текст ASCII, с ограничителями строки CRLF
    

    Теперь давайте покажем содержимое файла.

     Теперь давайте покажем содержимое файла.
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка № 1 ^ M $ 
     Строка № 2 ^ M $ 
    

    Команда Cat -E

    Команда «cat -E» показывает конец строки символом доллара ($). Следующий пример SED — симуляция того же самого.

    [jerry]$ echo -e "Line #1\nLine #2" > test.txt 
    [jerry]$ cat -E test.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Линия № 1 $ 
     Строка № 2 $
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ sed 's|$|&$|' test.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Линия № 1 $ 
     Строка № 2 $
    

    Cat -ET Command

    Команда «cat -ET» показывает символ доллара ($) в конце каждой строки и отображает символы табуляции как «^ I». В следующем примере показано моделирование команды «cat -ET» с использованием SED.

    [jerry]$ echo -e "Line #1\tLine #2" > test.txt 
    [jerry]$ cat -ET test.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка # 1 ^ ILine # 2 $ 
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка # 1 ^ ILine # 2 $ 
    

    NL Command

    Команда «nl» просто нумерует строки файлов. Следующий скрипт SED имитирует это поведение.

    [jerry]$ echo -e "Line #1\nLine #2" > test.txt 
    [jerry]$ sed = test.txt | sed 'N;s/\n/\t/'
    

    Выполнив приведенный выше код, вы получите следующий результат:

     1 строка № 1 
     2 строка № 2
    

    Первое выражение SED печатает номера строк, за которыми следует их содержимое, а второе выражение SED объединяет эти две строки и преобразует символы новой строки в символы TAB.

    команда cp

    Команда «cp» создает другую копию файла. Следующий скрипт SED имитирует это поведение.

    [jerry]$ sed -n 'w dup.txt' data.txt 
    [jerry]$ diff data.txt dup.txt 
    [jerry]$ echo $? 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     0
    

    Развернуть команду

    Команда «развернуть» преобразует символы табуляции в пробелы. Следующий код показывает его симуляцию.

    [jerry]$ echo -e "One\tTwo\tThree" > test.txt 
    [jerry]$ expand test.txt > expand.txt 
    [jerry]$ sed 's/\t/     /g' test.txt > new.txt 
    [jerry]$ diff new.txt expand.txt  
    [jerry]$ echo $? 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     0 
    

    Tee Command

    Команда «tee» сбрасывает данные в стандартный поток вывода, а также в файл. Ниже приведено моделирование команды «тройник».

    [jerry]$ echo -e "Line #1\nLine #2" | tee test.txt  
    Line #1 
    Line #2 
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ sed -n 'p; w new.txt' test.txt  
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1 
     Строка № 2
    

    кошка-команда

    Команда UNIX «cat -s» подавляет повторяющиеся пустые выходные строки. Следующий код демонстрирует симуляцию команды «cat -s».

    [jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt  
    [jerry]$ cat -s test.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1  
     Строка № 2
     Строка № 3
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1  
     Строка № 2  
     Строка № 3 
    

    команда grep

    По умолчанию команда «grep» печатает строку, когда совпадение с образцом завершается успешно. Следующий код показывает его симуляцию.

    [jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
    [jerry]$ grep "Line #1" test.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ sed -n '/Line #1/p' test.txt 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка 1 
    

    Команда grep -v

    По умолчанию команда «grep -v» печатает строку, когда не удается сопоставить шаблон. Следующий код показывает его симуляцию.

    [jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
    [jerry]$ grep -v "Line #1" test.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка № 2 
     Строка № 3 
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ sed -n '/Line #1/!p' test.txt
    

    Выполнив приведенный выше код, вы получите следующий результат:

     Строка № 2 
     Строка № 3
    

    tr Command

    Команда «tr» переводит символы. Ниже приведено его моделирование.

    [jerry]$ echo "ABC" | tr "ABC" "abc" 
    

    Выполнив приведенный выше код, вы получите следующий результат:

     азбука
    

    Давайте смоделируем команду, используя SED.

    [jerry]$ echo "ABC" | sed 'y/ABC/abc/'
    

    Выполнив приведенный выше код, вы получите следующий результат: