как найти слово с одной заглавной буквой? - PullRequest
1 голос
/ 04 апреля 2020

Файл txt:

bar
quux
kabe
Ass
sBo
CcdD
FGH

Я хотел бы использовать слова только с одной заглавной буквой в этом примере, но когда я использую "grep [AZ]", он показывает мне все слова с заглавными буквами.

Может кто-нибудь найти решение "grep" здесь? Мой ожидаемый результат -

Ass
sBo

Ответы [ 2 ]

1 голос
/ 04 апреля 2020
grep '\<[a-z]*[A-Z][a-z]*\>' my.txt

будет соответствовать строкам в текстовом файле ASCII my.txt, если они содержат хотя бы одно слово, состоящее полностью из букв ASCII, ровно одна из которых является заглавной.

0 голосов
/ 04 апреля 2020

У вас, похоже, есть текстовый файл с каждым словом в отдельной строке.

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

grep '^[[:lower:]]*[[:upper:]][[:lower:]]*$' file

См. grep онлайн-демонстрацию .

^ соответствует началу строки (здесь строка, поскольку grep по умолчанию работает на основе строки по строке), затем [[:lower:]]* соответствует 0 или более строчным буквам, затем [[:upper:]] шаблон соответствует любой заглавной букве, а затем [[:lower:]]* соответствует 0+ строчным буквам, а $ устанавливает позицию в конце строки.

Если вам нужно сопоставить всю строку ровно с одной заглавной буквой, вы можете используйте

grep '^[^[:upper:]]*[[:upper:]][^[:upper:]]*$' file

Единственное отличие от вышеприведенного шаблона - выражение в скобках [^[:upper:]], соответствующее любому символу, кроме заглавной буквы. См. еще одну grep онлайн-демонстрацию .

Чтобы извлечь слова с одной заглавной буквой внутри, вы можете использовать границы слов, как показано в ответе mathguy. С GNU grep вы также можете использовать

grep -o '\b[^[:upper:]]*[[:upper:]][^[:upper:]]*\b' file
grep -o '\b[[:lower:]]*[[:upper:]][[:lower:]]*\b' file

См. еще одну grep онлайн-демонстрацию .

...