正则表达式 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>.*
匹配任意字符(换行符除外)任意次数
$
断言行尾的位置
我有一个 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>.*
匹配任意字符(换行符除外)任意次数$
断言行尾的位置