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