Чому 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 sedз Ubuntu, -rпараметр означає "використовувати розширені регулярні вирази". Таким чином, дана команда працює добре, хоча для роботи не потрібні функції розширених регулярних виразів.
Крейг МакКуїн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.