我有一个UNIX passwd文件,如果来自GECOS的前7个字符位于用户名内,则需要使用egrep查找。我想检查用户名(jkennedy)是否包含GECOS中的“ kennedy”一词。
我打算使用反向引用,但是用户名早于gecos,所以我不知道如何实现它。
例如,passwd文件包含以下行:
jkennedy:x:2473:1067:kennedy john:/ root:/ bin / bash
答案 0 :(得分:0)
假设您不希望区分大小写破坏您的匹配-
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
答案 1 :(得分:0)
根据我的原始评论,下面的正则表达式对我有用。
See it in use here-请注意,此正则表达式略有不同,因为它更多地用于显示目的。下面的正则表达式是此的POSIX版本,并删除了非捕获组和回引用周围不需要的捕获组。
^[^:]*([^:]{7})([^:]*:){4}\1.*$
^
在行的开头断言位置[^:]*
与:
以外的任何字符匹配任意次数([^:]{7})
精确捕获除:
之外的所有字符中的七个字符([^:]*:){4}
准确匹配以下四次
[^:]*:
与:
以外的任何字符匹配任意次,并按字面意义依次匹配:
\1
匹配后向引用;匹配先前与第一个捕获树胶匹配的对象.*
匹配任意字符(换行符除外)任意次数$
在行尾声明位置