Почему 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'
                                     ^
alestanis
источник
1
sed -e следует использовать вместо sed -r, которого не существует.
Дилан Дэниэлс
1
@DylanDaniels Согласно man sedUbuntu, -rопция означает «использовать расширенные регулярные выражения». Таким образом, данная команда работает нормально, хотя для работы ей не нужны функции расширенных регулярных выражений.
Craig McQueen