Как к grep (печатают только), строки, запускающиеся с прописного строчного шаблона?

У меня есть команда, которая печатает строки в формате "Name:nickname". Но так как это - вывод от getent, это также содержит некоторые строки, которые не являются именами.

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

Я скопировал эту команду для печати только строк, запускающихся с верхнего регистра:

... | grep -P '^[^\s]+\s+[A-Z]'

Теперь, как я должен расширить команду, таким образом, она проверяет вторую букву также и печатает строку, только если это - нижний регистр?

1
задан 3 April 2020 в 21:46

2 ответа

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

... | grep '^[[:upper:]][[:lower:]]'

Этому не нужен PCRE (-P) или даже расширенный (-E) поддержка регулярного выражения.

1
ответ дан 7 April 2020 в 23:20

Я заметил в Вашем примере 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/^ *//'

Всего наилучшего

0
ответ дан 7 April 2020 в 23:20

Другие вопросы по тегам:

Похожие вопросы: