Учебники

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

Как и другие языки программирования, 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 

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