У меня есть команда, которая печатает строки в формате "Name:nickname". Но так как это - вывод от getent, это также содержит некоторые строки, которые не являются именами.
Однако они все являются или только прописными или только строчными, тогда как "реальные" имена запускаются с одной прописной буквы и одной строчной буквы.
Я скопировал эту команду для печати только строк, запускающихся с верхнего регистра:
... | grep -P '^[^\s]+\s+[A-Z]'
Теперь, как я должен расширить команду, таким образом, она проверяет вторую букву также и печатает строку, только если это - нижний регистр?
Можно соответствовать строкам, которые запускаются с прописной буквы, сопровождаемой по крайней мере одной строчной буквой с помощью скобок POSIX:
... | grep '^[[:upper:]][[:lower:]]'
Этому не нужен PCRE (-P
) или даже расширенный (-E
) поддержка регулярного выражения.
Я заметил в Вашем примере RegEx '^[^\s]+\s+[A-Z]'
(хотя это не правильно форматировано), что Вы пытаетесь получить даже те строки, которые запускаются с вакуума перед подлинными именами. Если я прямо тогда, можно использовать RegEx '(^[\s]+[A-Z][a-z]+)|(^[A-Z][a-z]+)'
в Вашем grep
управляйте как так:
... | grep -P '(^[\s]+[A-Z][a-z]+)|(^[A-Z][a-z]+)'
Это произведет все строки, которые запускаются с прописной буквы, сопровождаемой любым количеством строчных букв в первом слове, даже если этому предшествуют с каким-либо количеством пробелов в той же строке.
Объяснение:
Это соответствует любой из этих двух групп, содержавшихся в каждом ()
и разделенный или оператор |
.
^
запустится в начале строки.[\s]
будет соответствовать любому пробельному символу (пробелы, вкладки, разрывы строки).
+
будет соответствовать 1 или больше набора предшествующего символа.
[A-Z]
будет соответствовать одной прописной букве.
[a-z]+
будет соответствовать одному или нескольким строчная буква.
Уведомление:
Вы могли бы хотеть удалить предыдущее пространство в выходных строках. В этом случае передают вывод по каналу к инструменту как sed
и используйте его с sed 's/^ *//'
где ^ *
будет запускаться в начале строки и соответствовать одним или нескольким непрерывным пробелам затем, она будет удалена. Используйте его как так:
... | grep -P '(^[\s]+[A-Z][a-z]+)|(^[A-Z][a-z]+)' | sed 's/^ *//'
Всего наилучшего