Різні інструменти та їх версії підтримують різні варіанти регулярних виразів. Документація кожного з них розповість, що вони підтримують.
Стандарти існують, щоб можна було покластися на мінімальний набір функцій, доступний у всіх відповідних програмах.
Наприклад, всі сучасні реалізації 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:]/]у такому випадку).