Regex POSIX - Как я могу найти, если начало строки содержит слово из слова, которое появляется позже в строке - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть файл UNIX passwd, и мне нужно найти, используя egrep, если первые 7 символов из GECOS находятся внутри имени пользователя. Я хочу проверить, содержит ли имя пользователя (jkennedy) слово "kennedy" из GECOS.

Я планировал использовать обратные ссылки, но имя пользователя раньше, чем у gecos, поэтому я не знаю, как это реализовать.

Например, файл passwd содержит следующую строку:

jkennedy: x: 2473: 1067: kennedy john: / root: / bin / bash

Ответы [ 2 ]

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

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

См. Здесь в использовании - обратите внимание, что это регулярное выражение немного отличается, поскольку оно больше используется для целей отображения. Ниже приведено регулярное выражение для POSIX-версии, которое удаляет группы без перехвата и ненужную группу перехвата вокруг обратной ссылки.

^[^:]*([^:]{7})([^:]*:){4}\1.*$
  • ^ Утверждение позиции в начале строки
  • [^:]* соответствует любому символу, кроме : любое количество раз
  • ([^:]{7}) захватить ровно семь любых персонажей, кроме :
  • ([^:]*:){4} соответствует следующему ровно четыре раза
    • [^:]*: соответствует любому символу, кроме : любое количество раз, после которого : буквально
  • \1 соответствует обратной ссылке; соответствует тому, что было ранее сопоставлено с первой группой захвата
  • .* соответствует любому символу (кроме символов новой строки) любое количество раз
  • $ подтвердить позицию в конце строки
0 голосов
/ 04 апреля 2019

Предполагая, что вы НЕ хотите, чтобы чувствительность к регистру нарушала соответствие -

declare -l tmpUsr tmpName
while IFS=: read usr x x x name x
do tmpUsr="$usr"; tmpName="$name"
   (( ${#name} )) && [[ "$tmpUsr" =~ ${tmpName:0:7} ]] &&
      printf "$usr ($name<${tmpName:0:7}>)\n"
done</etc/passwd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...