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

0
SUCCESS: Your vote is considered!

команда s, модификатор g, и числовые модификаторы.


В прошлом посте я уже показал как классно sed заменяет grep. Вот только не совсем это так...

 

$ cat go.txt | grep 'на'
Слушай как бежит по вздутым венам вдаль твоя сладкая радуга
Как на яблоне на ветке созревает звезда
Крошечная, поздняя, милая, ручная
Как лениво высыхает молоко на губах

 

Видно, что grep выделяет не только первое найденное совпадение, но и все остальные. Такого поведения не сложно добиться и от нашей sed, достаточно добавить модификатор

g

.

 

$ cat go.txt | sed -rn '/на/ s//\x1b[31m&\x1b[0m/gp'
Слушай как бежит по вздутым венам вдаль твоя сладкая радуга
Как на яблоне на ветке созревает звезда
Крошечная, поздняя, милая, ручная
Как лениво высыхает молоко на губах

 

Видно, что этот модификатор заставляет sed находить и заменять все вхождения нужного нам образца.

 

Почему-же сделано так, что по умолчанию ищется только первое совпадение? Ответ прост - для увеличения быстродействия. Обычно sed обрабатывает большие файлы, потому у неё нет времени менять каждое вхождение, достаточно одной таблетки

;)

Однако и это можно поменять! Возможно так-же задание цифрового модификатора:

 

$
[doc@localhost ~]$ cat go.txt | sed -rn '/Крошечная/ s/я/\x1b[31m&\x1b[0m/1p'
Крошечная, поздняя, милая, ручная
[doc@localhost ~]$ cat go.txt | sed -rn '/Крошечная/ s/я/\x1b[31m&\x1b[0m/2p'
Крошечная, поздняя, милая, ручная
[doc@localhost ~]$ cat go.txt | sed -rn '/Крошечная/ s/я/\x1b[31m&\x1b[0m/3p'
Крошечная, поздняя, милая, ручная
[doc@localhost ~]$ cat go.txt | sed -rn '/Крошечная/ s/я/\x1b[31m&\x1b[0m/4p'
Крошечная, поздняя, милая, ручная
[doc@localhost ~]$ cat go.txt | sed -rn '/Крошечная/ s/я/\x1b[31m&\x1b[0m/5p'
Крошечная, поздняя, милая, ручная

 

Здесь видно, что заменяется не первое совпадение, а то, которое задано модификатором.

 

Можно комбинировать числовой модификатор с модификатором g

 

$ cat go.txt | sed -rn '/Крошечная/ s/я/\x1b[31m&\x1b[0m/3gp'
Крошечная, поздняя, милая, ручная

 

Тут найдены 3 последних совпадения. Точнее это

все совпадения, начиная с третьего

.


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