команда s, модификатор g, и числовые модификаторы.
В прошлом посте я уже показал как классно sed заменяет grep. Вот только не совсем это так...
Как на яблоне на ветке созревает звезда
Крошечная, поздняя, милая, ручная
Как лениво высыхает молоко на губах
Видно, что grep выделяет не только первое найденное совпадение, но и все остальные. Такого поведения не сложно добиться и от нашей sed, достаточно добавить модификатор
g
.
Как на яблоне на ветке созревает звезда
Крошечная, поздняя, милая, ручная
Как лениво высыхает молоко на губах
Видно, что этот модификатор заставляет sed находить и заменять все вхождения нужного нам образца.
Почему-же сделано так, что по умолчанию ищется только первое совпадение? Ответ прост - для увеличения быстродействия. Обычно sed обрабатывает большие файлы, потому у неё нет времени менять каждое вхождение, достаточно одной таблетки
;)
Однако и это можно поменять! Возможно так-же задание цифрового модификатора:
Крошечная, поздняя, милая, ручная
[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
Тут найдены 3 последних совпадения. Точнее это
все совпадения, начиная с третьего
.