sed на OS X - не могу использовать + в регулярных выражениях - PullRequest
25 голосов
/ 04 августа 2009

Теперь по всей литературе

echo 1234abcd|sed "s|[0-9]\+|#|g"

должен вывести #abcd. И

echo abcd|sed "s|[0-9]\+|#|g"

должен вывести abcd.

Но в OS X 10.4.11 первое выражение выдает 1234abcd. Использование * вместо + работает для первого примера, но завершается с ошибкой во втором, выводя #abcd, потому что шаблон [0-9] сопоставляется ноль раз.

Не работает ли оператор + в регулярных выражениях в OS X? Есть ли альтернатива?

Спасибо

Ответы [ 5 ]

53 голосов
/ 04 августа 2009

В OSX sed по умолчанию использует базовые RE. Вам следует использовать sed -E, если вы хотите использовать современные RE, включая оператор "+" one-or-more.

См. здесь для указания того, что sed использует базовые RE по умолчанию, здесь для современного синтаксиса RE и здесь для базового RE ( ed) информация.


В качестве альтернативы, если у вас есть механизм регулярных выражений, который не вообще не поддерживает +, вы можете просто использовать вместо него *, преобразовав (например):

[a-z]+

в:

[a-z][a-z]*
8 голосов
/ 04 августа 2009

Устаревшие базовые регулярные выражения не поддерживают квантификаторы + и ?. Это обычные персонажи.

Альтернативами для [0-9]+ являются, например, [0-9]{1,} или [0-9][0-9]*.

Или вы можете использовать sed -E для использования современных расширенных регулярных выражений.

2 голосов
/ 04 августа 2009

Если + не работает, вы всегда можете использовать {1,}

1 голос
/ 04 августа 2009

Многие из утилит OS X unix имеют версии, которые не имеют комфорта своих эквивалентов GNU. Как говорит Пакс, вы можете использовать -E:

drigz@mbp drigz 0$ echo 1234abcd | /usr/bin/sed "s/[0-9]\+/#/g" 
1234abcd
drigz@mbp drigz 0$ echo 1234abcd | /usr/bin/sed -E "s/[0-9]+/#/g" 
#abcd

Обратите внимание, что требуются небольшие изменения в синтаксисе вашего регулярного выражения (в данном случае \ + к +).

Однако я предпочитаю использовать fink для получения утилит GNU:

drigz@mbp drigz 0$ echo 1234abcd | /sw/bin/sed "s/[0-9]\+/#/g"
#abcd
drigz@mbp drigz 0$ /sw/bin/sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
1 голос
/ 04 августа 2009

вы можете использовать awk

# echo 1234abcd| awk '{gsub(/[0-9]+/,"#")}1'
#abcd

# echo abcd| awk '{gsub(/[0-9]+/,"#")}1'
abcd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...