Регулярные выражения в shell(bash), на примере использования sed.

0
SUCCESS: Your vote is considered!

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


sed это потоковый редактор. В отличие от других редакторов, sed не загружает в память текст, а работает с потоком. По этой причине для sed нет никакого ограничения в размере файлов. Кроме того, редактирование производится не оператором, а скриптом. Потому sed может редактировать файлы самостоятельно. sed намного лучше всяких vi и nano, хотя-бы потому, что sed работает быстрее. Мне тут предлагали на спор отредактировать текст vim'ом быстрее меня, в моём редакторе... Но... Вы сможете проверять какой-то файл каждые 15 минут, и иногда, при определённых условиях, редактировать какой-то другой файл? Наверное сможете. Вместе с напарником, потому как вам наверное и спать иногда надо... И ещё денег за это попросите. А ещё всё равно будете ошибаться. А sed у меня

уже

выполняет такую работу, причём без ошибок, и совершенно бесплатно!



А разве нет других утилит?

Есть. Только нужно о них помнить, и не только о них, но и все их ключи и все их глюки и ограничения. К примеру, для поиска строк с каким-то словом можно воспользоваться

grep

, вот только если задачка не самая примитивная(а примитивные бывают только в учебниках), то придётся ещё и прочитать не слишком короткий мануал(у меня 476 строк), и не факт, что grep это сможет, а если и сможет, то не факт что это там(в мане) записано. придётся читать ещё более здоровый info, и искать в google... Да и к тому-же можно запомнить сотню команд, но вот сотню

разных

ключей для каждой уже не реально... Потому лично я использую grep только в очень простых случаях... Да и то... По привычке.



Порядок работы sed

sed выполняется в 3 этапа:


  1. Ввод строки.
    На этом этапе sed вводит в свою память строку(из входного потока). От текущего символа, и до символа \n, причём \n вынимается из потока, однако в загруженной строке его нет. Кроме того, этот этап может завершится если в потоке больше нет данных.
  2. Выполнение.
    На этом этапе выполняются команды sed. Команды могут
    • Изменить строку(например s/a/b/ заменит первую найденную a на b)
    • Ввести новую строку из потока или из файла(команды n, r)
    • Вывести строку из памяти в выходной поток(команда p, или команда s с модификатором p)
    • Вывести строку из скрипта в выходной поток(a, i, и другие)
    • Вывести строку из памяти в какой-то файл(команда w)
    • Изменить порядок выполнения скрипта(команды t, T, b, q, Q)
    • Отменить третий этап(d и D)
    • Вывести в выходной поток номер строки
    • Прочитать/записать/обменять область удержания hold space, HS(команды h,H,g,G,x)
  3. Вывод строки.
    На этом этапе строка выводится в выходной поток. Этот этап можно отменить след. способами:
    • ключём -n
    • командами d или D
    • командой Q(эта команда не только завершает работу sed так, как если бы текущая строка последняя, но и отменяет вывод буфера.

sed выполняет все этапы для каждой строки входного потока(если вы конечно какие-то этапы не отменили, кроме того, некоторые строки можно загружать из потока внутри второго этапа)


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


Команды для sed можно писать по одной в каждой строке, либо несколько команд в строке(через ;, однако не для всех команд это действует, некоторые команды должны быть последними в строке)


Особой командой является метка, записывается :label. Она не выполняется, однако может служить точкой перехода для команд t, T, и b. В одной строке я пишу только метку. Хотя можно использовать 2 скрипта в одной команде, тогда можно свернуть цикл в одну строку:


Код:
$ sed -e :l -e bl ~/.bashrc

Это бесконечный цикл. сначала sed прочитает первую строку ~/.bashrc(1й этап), а потом зависнет навсегда на втором этапе.

  • 29 октября 2015 г. 16:19. Posted by Цитировать #593
    Текст перспективный, добавлю сайт в закладки

Пожалуйста войдите, что-бы оставить коментарий.
Нет акаунта? Регистрация