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

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


person Alec Jacobson    schedule 15.12.2010    source источник
comment
используя флаг /g, s/o//g достаточно, чтобы заменить все o вхождения.   -  person khachik    schedule 15.12.2010


Ответы (4)


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

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

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

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

person khachik    schedule 15.12.2010
comment
+1, с флагом -E работает как описано. Однако по какой-то причине я не смог найти это на страницах man/info. Официально кажется, что варианты -r и --regexp-extended — это то, что нужно. - person Chriki; 21.03.2014

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

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

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

person Marco Carvalho    schedule 18.04.2013

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

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

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

person stever    schedule 15.12.2010
comment
В Terminal.app вам может понадобиться использовать двойную обратную косую черту. - person eyelidlessness; 15.12.2010
comment
@eyelidless тоже не работает. Смотрите мой ответ для получения дополнительной информации. - person khachik; 15.12.2010

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

echo "foobar" | perl -pe "s/o+//g"
person XY WANG    schedule 14.08.2015
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его сообщением — вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно репутация, вы сможете комментировать любой пост. - person Am_I_Helpful; 14.08.2015
comment
Используйте это, чтобы решить проблему, и вам не нужно заботиться о проблеме побега. - person XY WANG; 14.08.2015