正则表达式从可分辨名称解析公共名称

时间:2012-07-20 15:39:01

标签: regex macos bash distinguishedname dscl

我试图在OSX终端 bash 环境中从sed命令返回的以下DN中解析(First LastDSCL CN=First Last,OU=PCS,OU=guests,DC=domain,DC=edu ...

DSCL

我已经尝试过来自这个网站的多个正则表达式和其他问题非常接近我想要的问题...主要是this question ...我已尽力遵循我的建议(我不是一定认为自己是新手...但绝对是正则表达的新手..)

First Last会返回一个DN列表,我希望只将sed打印到文本文件中。我曾尝试使用CN=,但似乎无法获得正确的功能。我打开其他命令来解析输出。每行以Last开头,然后OU=和{{1}}之间有一个逗号。

非常感谢你的帮助!

6 个答案:

答案 0 :(得分:4)

我认为到目前为止提供的所有正则表达式答案都是错误的,因为它们没有正确处理引用的','常用名称中的字符。例如,考虑一个distinguishedName,如:

CN=Doe\, John,CN=Users,DC=example,DC=local

最好使用能够解析distinguishedName组件的真实库。如果您正在命令行上快速查找某些内容,请尝试将DN管道传送到如下命令:

    echo "CN=Doe\, John,CN=Users,DC=activedir,DC=local" | python -c 'import ldap; import sys; print ldap.dn.explode_dn(sys.stdin.read().strip(), notypes=1)[0]'

(取决于安装了python-ldap库)。你可以用PHP的内置ldap_explode_dn()函数做类似的东西。

答案 1 :(得分:2)

两个cut命令可能是最简单的(尽管不一定是最好的):

DSCL | cut -d, -f1 | cut -d= -f2

首先,在逗号分割DSCL的输出并打印第一个字段(“CN = First Last”);然后将它分成等号并打印第二个字段。

答案 2 :(得分:1)

使用sed:

sed 's/^CN=\([^,]*\).*/\1/' input_file
^           matches start of line 
CN=         literal string match
\([^,]*\)   everything until a comma
.*          rest

答案 3 :(得分:1)

http://www.gnu.org/software/gawk/manual/gawk.html#Field-Separators

awk -v RS=',' -v FS='=' '$1=="CN"{print $2}' foo.txt

答案 4 :(得分:0)

我也喜欢awk,所以我从第四个字符打印子字符串:

DSCL | awk '{FS=","}; {print substr($1,4)}' > filterednames.txt

答案 5 :(得分:0)

此正则表达式将解析一个专有名称,为每个匹配提供nameval个捕获组。

当DN字符串包含逗号时,它们应该被引用 - 这个正则表达式正确处理引号和非引号字符串,并且还处理带引号的字符串中的转义引号:

(?:^|,\s?)(?:(?<name>[A-Z]+)=(?<val>"(?:[^"]|"")+"|[^,]+))+

格式很好:

(?:^|,\s?)
(?:
    (?<name>[A-Z]+)=
    (?<val>"(?:[^"]|"")+"|[^,]+)
)+

这是一个链接,您可以在其中看到它: https://regex101.com/r/zfZX3f/2

如果你想要一个正则表达式只能 CN,那么这个改编的版本将会这样做:

(?:^|,\s?)(?:CN=(?<val>"(?:[^"]|"")+"|[^,]+))