我试图在OSX终端 bash 环境中从sed
命令返回的以下DN中解析(First Last
)DSCL
CN=First Last,OU=PCS,OU=guests,DC=domain,DC=edu
...
DSCL
我已经尝试过来自这个网站的多个正则表达式和其他问题非常接近我想要的问题...主要是this question ...我已尽力遵循我的建议(我不是一定认为自己是新手...但绝对是正则表达的新手..)
First Last
会返回一个DN列表,我希望只将sed
打印到文本文件中。我曾尝试使用CN=
,但似乎无法获得正确的功能。我打开其他命令来解析输出。每行以Last
开头,然后OU=
和{{1}}之间有一个逗号。
非常感谢你的帮助!
答案 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)
此正则表达式将解析一个专有名称,为每个匹配提供name
和val
个捕获组。
当DN字符串包含逗号时,它们应该被引用 - 这个正则表达式正确处理引号和非引号字符串,并且还处理带引号的字符串中的转义引号:
(?:^|,\s?)(?:(?<name>[A-Z]+)=(?<val>"(?:[^"]|"")+"|[^,]+))+
格式很好:
(?:^|,\s?)
(?:
(?<name>[A-Z]+)=
(?<val>"(?:[^"]|"")+"|[^,]+)
)+
这是一个链接,您可以在其中看到它: https://regex101.com/r/zfZX3f/2
如果你想要一个正则表达式只能 CN,那么这个改编的版本将会这样做:
(?:^|,\s?)(?:CN=(?<val>"(?:[^"]|"")+"|[^,]+))