On 16.05.2007 17:19, Martin Portman wrote:
> anon1m0us wrote:
>> Hi; I have a command to obtain all the groups a user is part of. The
>> command is:
>> dsquery user domainroot -samid <user name> | dsget user -memberof -
>> expand
>>
>> The output is:
>> "CN=Domain Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com"
>> "CN=DA-C3-AB-AB1-SERVER-DATA-CHANGE,OU=ACL_Groups,OU=Groups,OU=ABC,DC=
>> testdc,DC=testroot,DC=test,DC=com"
>>
>>
>> I need to obtain the group name From after CN= until the first comma.
>> I tried scan and match. I can't get it right.
> 
> 
> irb(main):001:0> output = "CN=Domain 
> Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com"
> 
> irb(main):006:0> output.split(',')
> => ["CN=Domain Users", "CN=Users", "DC=testdc", "DC=testroot", 
> "DC=test", "DC=com"]
> 
> irb(main):008:0> output.split(',').grep(/CN=/)
> => ["CN=Domain Users", "CN=Users"]
> 
> irb(main):009:0> output.split(',').grep(/CN=/).collect{|a| a=~/CN=(.*)/; 
> $1}
> => ["Domain Users", "Users"]
> 
> You can do what you want with the final array.
> 
> The final collect part of the last line is a bit cryptic.  Others may 
> follow with more elegant ways of doing this.

A variation:

irb(main):018:0* output = "CN=Domain 
Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com"
=> "CN=Domain Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com"
irb(main):019:0> output.split(/,/).map {|s| s[/^CN=(.*)$/, 1]}
=> ["Domain Users", "Users", nil, nil, nil, nil]
irb(main):020:0> output.split(/,/).map {|s| s[/^CN=(.*)$/, 1]}.compact
=> ["Domain Users", "Users"]
irb(main):021:0> output.split(/,/).map! {|s| s[/^CN=(.*)$/, 1]}.compact!
=> ["Domain Users", "Users"]

Or, probably a bit more efficient

irb(main):023:0> output.split(/,/).inject([]) {|ar,s| x=s[/^CN=(.*)$/, 
1] and ar << x;ar}
=> ["Domain Users", "Users"]

Or, with enumerator

irb(main):032:0> output.to_enum(:scan, /(?:\A|,)CN=([^,]*)/).map {|m| m[0]}
=> ["Domain Users", "Users"]

A more generic approach would first extract all the information from the 
record and then select the piece wanted:

irb(main):037:0> data = output.to_enum(:scan, /(?:\A|,)([^=]+)=([^,]*)/).
irb(main):038:0* inject(Hash.new {|h,k| h[k]=[]}) {|ha,m| ha[m[0]] << 
m[1];ha}
=> {"CN"=>["Domain Users", "Users"], "DC"=>["testdc", "testroot", 
"test", "com"]}
irb(main):039:0> data["CN"]
=> ["Domain Users", "Users"]

Ok, I have too much time today... :-)

Kind regards

	robert