Різні інструменти та їх версії підтримують різні варіанти регулярних виразів. Документація кожного з них розповість, що вони підтримують.
Стандарти існують, щоб можна було покластися на мінімальний набір функцій, доступний у всіх відповідних програмах.
Наприклад, всі сучасні реалізації sed
та grep
реалізація основних регулярних виразів, визначених POSIX (принаймні одна версія чи інша версія стандарту, але цей стандарт не розвинувся в цьому відношенні за останні кілька десятиліть).
У POSIX BRE та ERE у вас є [:alnum:]
клас символів. Це відповідає буквам і цифрам у вашій мові (зверніть увагу, що часто включає набагато більше, ніж, a-zA-Z0-9
якщо локаль не C).
Так:
grep -x '[[:alnum:]_]\{1,\}'
відповідає одній або більше alnum або _.
[\w]
вимагає POSIX, щоб відповідати або зворотній косій лінії, або w
. Таким чином, ви не знайдете grep
або sed
втілення, де це доступно (якщо тільки не з нестандартними параметрами).
Поведінка \w
окремо не визначена POSIX, тому реалізаціям дозволяється робити те, що вони хочуть. ГНУ grep
додав, що це давно.
У GNU grep
раніше існував власний механізм regexp, однак тепер він використовується libc GNU (хоча він вбудовує власну копію).
Це покликане відповідати випускникам та підкресленням у вашій місцевості. Однак, в даний момент помилка в тому, що вона відповідає лише однобайтовим символам (наприклад, не é в локалі UTF-8, хоча це явно буквою, і хоча вона відповідає é у всіх локалях, де é є одиничним персонаж).
Існує також \w
оператор regexp в perl regexp і в PCRE. PCRE / perl не є регулярними виразами POSIX, вони взагалі просто інша річ.
Тепер, з тим, як GNU grep -P
використовує PCRE, у нього виходить та сама проблема, що і без -P
. Це можна вирішити там, хоча за допомогою (*UCP)
(хоча це також має побічні ефекти в не-UTF8-локалях).
GNU sed
також використовує регекси GNU libc для власних регулярних виразів. Він використовує його таким чином, хоча він не має тієї ж помилки, як GNU grep
.
GNU sed
не підтримує PCRE. У кодексі є деякі докази того, що він робився раніше, але, здається, це вже не стоїть на порядку денному.
Якщо ви хочете регулярних виразів Perl, просто використовуйте, perl
хоча.
Інакше я б сказав, що замість того, щоб намагатися покладатися на хибну нестандартну особливість вашої конкретної реалізації sed
/ grep
, було б краще дотримуватися стандарту та використовувати [_[:alnum:]]
.
[_[:alnum:]]
це хороший спосіб вирішення, який дозволяє мені розширити його так само[\w/]
([_[:alnum:]/]
у такому випадку).