grep только для слов верхнего регистра

63
4

Я хотел бы найти все слова, которые все прописные, но когда я это делаю

grep -oP '\w*[A-Z]+\w*' *

я получил

words.py:StringValue
words.py:WORDS
words.py:WORDS_ANSWERED
words.py:Answered
words.py:True

где я надеялся

words.py:WORDS
words.py:WORDS_ANSWERED

Вопрос

Как я могу убедиться, что выводятся только все слова верхнего регистра?

спросил(а) 2021-01-25T16:08:51+03:00 4 месяца, 4 недели назад
1
Решение
116

Вы можете использовать это регулярное выражение со словом границы с обеих сторон и используя [A-Z0-9_] вместо \w:

grep -H -oP '\b[A-Z0-9_]*[A-Z]+[A-Z0-9_]*\b' *

words.py:WORDS
words.py:WORDS_ANSWERED

ответил(а) 2021-01-25T16:08:51+03:00 4 месяца, 4 недели назад
46

Регулярное выражение считает, что слова S, A и T являются прописными словами. Так что это зависит от того, как вы определяете слово в верхнем регистре. Из ваших примеров, похоже, вы ищете нечто вроде ^[A-Z_]+$. Или, если под словом "uppercase" вы имеете в виду "нет строчных символов", [^az]+$

ответил(а) 2021-01-25T16:08:51+03:00 4 месяца, 4 недели назад
45

Если вы не хотите, чтобы \w на выходе, не включайте его в шаблон.

grep -oP '[A-Z]+' *

Однако, чтобы получить ожидаемый результат, вам необходимо включить символы подчеркивания и слова:

grep -oP '\b[A-Z_0-9]+\b'

Если вы хотите избежать ____ и аналогичных (они распространены в коде Python?), Используйте

grep -oP '\b[A-Z_0-9]*[A-Z][A-Z_0-9]*\b'

ответил(а) 2021-01-25T16:08:51+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема