Если я запустил этот код в 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 sedUbuntu, -rопция означает «использовать расширенные регулярные выражения». Таким образом, данная команда работает нормально, хотя для работы ей не нужны функции расширенных регулярных выражений.
gфлаг для глобальной подстановки, здесь вам тоже не нужна-rопция.