正则表达式从专有名称解析通用名称

问题描述 投票:0回答:6

我正在尝试仅从 OSX 终端

bash
环境中的
sed
命令返回的以下 DN 中解析(使用
First Last
DSCL...

CN=First Last,OU=PCS,OU=guests,DC=domain,DC=edu

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

DSCL
返回 DN 列表,我只想将
First Last
打印到文本文件中。 我尝试过使用
sed
,但我似乎无法获得正确的功能。 我愿意接受其他命令来解析输出。 每行都以
CN=
开头,然后
Last
OU=
之间有一个逗号。

非常感谢您的帮助!

regex macos bash distinguishedname dscl
6个回答
7
投票

我认为到目前为止提供的所有正则表达式答案都是有问题的,因为它们不能正确处理通用名称中带引号的“,”字符。例如,考虑一个类似的专有名称:

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

最好使用能够解析可分辨名称组件的真正库。如果您想在命令行上快速查找某些内容,请尝试将您的 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
投票

使用 sed:

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

1
投票

两个

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

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

首先,用逗号分割

DSCL
的输出并打印第一个字段(“CN=First Last”);然后将其拆分为等号并打印第二个字段。


1
投票

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

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

1
投票

此正则表达式将解析一个可分辨名称,为每个匹配项提供

name
val
一个捕获组。

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

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

这里的格式很好:

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

这里有一个链接,您可以看到它的实际效果: https://regex101.com/r/zfZX3f/2

如果你想让正则表达式获得CN,那么这个改编版本就可以做到:

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.