Если я запустил этот код в bash:
echo dog dog dos | sed -r 's:dog:log:'
он дает результат:
log dog dos
Как я могу заставить его заменить все вхождения собаки?
Если я запустил этот код в bash:
echo dog dog dos | sed -r 's:dog:log:'
он дает результат:
log dog dos
Как я могу заставить его заменить все вхождения собаки?
Ответы:
Вы должны добавить 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/
sed -E 's,foo,bar,g'
не имеет глобального значения. Если поменять на sed -E -e 's,foo,bar,g'
то работает.
Вы должны поставить g
в конце, это означает «глобальный»:
echo dog dog dos | sed -r 's:dog:log:g'
^
man sed
Ubuntu, -r
опция означает «использовать расширенные регулярные выражения». Таким образом, данная команда работает нормально, хотя для работы ей не нужны функции расширенных регулярных выражений.
g
флаг для глобальной подстановки, здесь вам тоже не нужна-r
опция.