Как избежать плюс знак на 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"

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

Вы можете использовать это, на linux или unix.

echo "foobar" | perl -pe "s/o+//g"