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? Есть ли альтернатива?
Спасибо
Ответы
Ответ 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.