Подтвердить что ты не робот

Sed на OS X - похоже, не может использовать + в regexps

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

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? Есть ли альтернатива?

Спасибо

4b9b3361

Ответ 1

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

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


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

[a-z]+

в

[a-z][a-z]*

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

[email protected] drigz 0$ echo 1234abcd | /sw/bin/sed "s/[0-9]\+/#/g"
#abcd
[email protected] 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.