string='binddn:cn=SxX.UXxxxM-E2A,OU=CA,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com'
Red Hat中的代码工作原理
dn=($(grep -oi 'cn=[^():]*dc=com' <<< "$string"))
我修改了AIX的代码,修改后的代码是
dn=($(grep -xi 'cn=[^():]*dc=com' "$string"))
代码在RedHat服务器中运行正常,在redhat中的输出是
dn[0]="cn=SxX.UXxxxM-E2A,OU=CA,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com"
AIX中的错误是
grep: can't open binddn:cn=SxX.UXxxxM-E2A,OU=CA,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com
已编辑:
另一个例子:
string = "userbasedn:DC=i,DC=companyname,DC=com?subtree?(&(objectcategory=person)(uidNumber=*)(|(memberOf:1.2.840.113556.1.4.1941:=cn=example1,OU=GROUPS,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com)(memberOf:1.2.840.11.1.4.1941:=cn=example2,OU=GROUPS,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com)))
groupbasedn:DC=i,DC=companyname,DC=com?subtree?(&(objectcategory=group)(gidNumber=*))"
预期产量
dn[0]=cn=example1,OU=GROUPS,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com
dn[1]=cn=example2,OU=GROUPS,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com
答案 0 :(得分:0)
如果可以使用awk
,请尝试以下操作:
echo "$string" | awk -F"cn=" 'NF>1{$0=tolower($0);for (i=2;i<=NF;i++) {split($i,a,"dc=com)");print FS a[1]"dc=com"}}'
cn=example1,ou=groups,ou=ai infrastructure,dc=i,dc=companyname,dc=com
cn=example2,ou=groups,ou=ai infrastructure,dc=i,dc=companyname,dc=com
答案 1 :(得分:0)
grep
的第二个参数是文件名,而不是字符串。 AIX正确地报告它找不到具有该名称的文件。如果您尝试相同的命令,则会在Red Hat上得到相同的错误。
不幸的是,-x
选项无法满足您的期望。它检查输入的整个行是否与正则表达式匹配。同样,您将在Red Hat上找到完全相同的行为。
根据{{3}},它支持-o
选项就可以了。
如果您没有Bash,则Bash“此处字符串”语法<<<"string"
不可用,但是很容易重新定义:
printf '%s\n' "$string" |
grep -oi 'cn=[^():]*dc=com'
如果您没有grep -o
,请尝试使用sed
:
printf '%s\n' "$string" |
sed -n 's/.*\(cn=[^():]*dc=com\).*/\1/p'
这并不完全相同,因为第一个.*
是贪婪的。如果您期望一行上有多个匹配项,则需要稍微复杂一点的正则表达式。