Якщо я запускаю цей код у 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
опція.