2010-12-15 2 views
15

Я пытаюсь найти и заменить одно или несколько вхождений персонажа с помощью sed на mac, sed из общих команд BSD.Как избежать плюс знак на mac os x (BSD) sed?

Стараюсь:

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

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

fbar 

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

foobar 

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

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

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

+0

с использованием флага `/ g`,` s/o // g` достаточно, чтобы заменить все вхождения `o`. – khachik 2010-12-15 19:09:34

ответ

27

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

Почему + не работает, как ожидалось: в старом, устаревшем повторно + обычный характер (а также |, ?). Вы должны указать -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, так что это может или не может работать для вас.

+0

Не работает на 10.5 ... – khachik 2010-12-15 19:06:40

+0

В Terminal.app вам может потребоваться двойная обратная косая черта. – eyelidlessness 2010-12-15 19:09:41

+0

@eyelidlessness Не работает. См. Мой ответ для получения дополнительной информации. – khachik 2010-12-15 19:16:15

0

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

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

Возможно, слишком много СЕПГА там иметь полезный инструмент на любой системе.

0

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

echo "foobar" | perl -pe "s/o+//g" 
Смежные вопросы