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