如何用sed命令提取LDAP格式字符串中的CN字段内容?
问题分析
你的原sed命令问题出在贪婪匹配上:.*会从CN=开始一直匹配到最后一个逗号之前的所有内容,完全忽略了CN值本身包含的转义逗号\,,所以无法正确提取目标内容。
修正后的sed命令
如果你的CN字段始终是LDAP字符串的第一个字段,可以用这个命令:
grep -i "CN" file | sed -E 's/^CN=([^,]*(\\,[^,]*)*),.*/\1/'
命令解释:
-E:启用扩展正则表达式,简化括号的转义写法^CN=:精准匹配行首的CN=,避免误匹配后续字段中可能出现的CN字符串([^,]*(\\,[^,]*)*):这个分组专门用来捕获带转义逗号的CN值:[^,]*:匹配任意数量的非逗号字符(\\,[^,]*)*:匹配任意次数的「转义逗号\,+ 非逗号字符」组合,确保把CN值里的转义逗号也包含进去
,.*/:匹配第一个未被转义的逗号及之后的所有内容,替换成前面捕获的分组内容\1
快速测试(无需文件)
如果不想用文件测试,可以直接用管道传递字符串验证效果:
echo "CN=Michael George\, Jou,OU=External,OU=User,DC=Company,DC=en" | sed -E 's/^CN=([^,]*(\\,[^,]*)*),.*/\1/'
执行后会输出预期结果:Michael George\, Jou
内容的提问来源于stack exchange,提问作者user8957934
相关产品推荐
相关产品推荐

