正则表达式 POSIX - 我如何找到一行的开头是否包含来自行中稍后出现的单词的单词

Regex POSIX - How can i find if the start of a line contains a word from a word that appears later in line

我有一个 UNIX 密码文件,如果 GECOS 的前 7 个字符在用户名中,我需要使用 egrep 查找。我想检查用户名 (jkennedy) 是否包含 GECOS 中的单词 "kennedy"。

我打算使用反向引用,但用户名在 gecos 之前,所以我不知道如何实现它。

例如密码文件包含这一行:

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

假设您不希望区分大小写破坏您的匹配 -

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

根据我最初的评论,下面的正则表达式适用于我。

See it in use here - 请注意此正则表达式略有不同,因为它更多地用于显示目的。下面的正则表达式是此的 POSIX 版本,并删除了非捕获组和反向引用周围不需要的捕获组。

^[^:]*([^:]{7})([^:]*:){4}.*$
  • ^ 在行首声明位置
  • [^:]* 匹配除 : 之外的任何字符任意次数
  • ([^:]{7}) 正好捕获除 :
  • 之外的任何字符的七个
  • ([^:]*:){4} 恰好匹配以下四次
    • [^:]*: 匹配除 : 之外的任何字符任意次数,后跟 : 字面意思
  • </code>匹配反向引用;匹配先前由第一个捕获组 </li> 匹配的内容 <li><code>.* 匹配任意字符(换行符除外)任意次数
  • $ 断言行尾的位置