Почему 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.