Почему sed не заменяет все вхождения?


118

Если я запустил этот код в bash:

echo dog dog dos | sed -r 's:dog:log:'

он дает результат:

log dog dos

Как я могу заставить его заменить все вхождения собаки?


2
Вам нужен gфлаг для глобальной подстановки, здесь вам тоже не нужна -rопция.
— Крис Сеймур

Ответы:


188

Вы должны добавить gмодификатор, чтобы sed выполнял глобальную замену содержимого буфера шаблонов:

echo dog dog dos | sed -e 's:dog:log:g'

Для получения фантастической документации по sed посетите http://www.grymoire.com/Unix/Sed.html . Этот глобальный флаг объясняется здесь: http://www.grymoire.com/Unix/Sed.html#uh-6

Официальная документация для GNU sedдоступна по адресу http://www.gnu.org/software/sed/manual/


1
Добавление здесь крайнего случая для GNU sed: sed -E 's,foo,bar,g'не имеет глобального значения. Если поменять на sed -E -e 's,foo,bar,g'то работает.
— Мелвин Сопакуа

23

Вы должны поставить gв конце, это означает «глобальный»:

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^

1
sed -e следует использовать вместо sed -r, которого не существует.
— Дилан Дэниэлс

1
@DylanDaniels Согласно man sedUbuntu, -rопция означает «использовать расширенные регулярные выражения». Таким образом, данная команда работает нормально, хотя для работы ей не нужны функции расширенных регулярных выражений.
— Craig McQueen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.