Как избежать плюса на Mac OS X (BSD) Sed?

Я пытаюсь найти и заменить одно или несколько вхождений персонажа, используя sed на mac, sed из общих команд BSD.

Я попробую:

echo "foobar" | sed -e "s/o+//g

ожидая увидеть:

fbar

Но вместо этого я вижу

foobar

Я могу, конечно, просто расширить плюс вручную:

echo "foobar" | sed -e "s/oo*//g"

но что мне нужно сделать, чтобы знак плюс работал?

4 ответа

Решение

С использованием /g флаг, s/o//g достаточно, чтобы заменить все o вхождений.

Зачем + не работает, как ожидалось: в старых, устаревших + это обычный персонаж (а также |, ?). Вы должны указать -E флаг для sed сделать это с помощью современных регулярных выражений:

echo "foobar" | sed -E -e "s/o+//"
# fbar

Источник: man 7 re_format,

echo "foobar" | sed -e "s/o\\+//g"

работал для меня на Mac OS X 10.6.

Я вспомнил, что я заменил мою версию BSD sed на GNU sed 4.2, так что это может работать, а может и не работать.

Сед грустно для регулярных выражений. Вы можете либо попробовать -E, который может работать с BSD, либо вместо этого:

sed -e "s/o\{1,\}/"

Возможно, есть слишком много sed, чтобы иметь пригодный для использования инструмент в любой системе.

Вы можете использовать это на Linux или Unix.

echo "foobar" | perl -pe "s/o+//g"
Другие вопросы по тегам