正则表达式POSIX-如何从行后出现的单词中查找行首是否包含单词

时间:2019-04-04 19:17:36

标签: regex posix

我有一个UNIX passwd文件,如果来自GECOS的前7个字符位于用户名内,则需要使用egrep查找。我想检查用户名(jkennedy)是否包含GECOS中的“ kennedy”一词。

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

例如,passwd文件包含以下行:

  

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

2 个答案:

答案 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匹配后向引用;匹配先前与第一个捕获树胶匹配的对象
  • .*匹配任意字符(换行符除外)任意次数
  • $在行尾声明位置