Как и другие языки программирования, 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
Выполнив приведенный выше код, вы получите следующий результат: