I am trying to transform an LDAP entry that looks like this:
/cn=Printer1/ou=HR/dc=N/A/dc=fabrikam/dc=com
I am using an awk script and am having a bit of trouble so any help is appreciated.
I am specifically trying to escape the "/" in dc=N/A so that it is quoted like dc="N/A". Actually, I would like to quote everything that is between the "=" and the next "/", so it looks like this.
Becasue another issue I am having is related to spaces to the right of the "=".
For example:
/cn=Printer1 Building 1/ou=HR/dc=N/A/dc=fabrikam/dc=com
My algorithm - right now - is to split the parts into an array at the "=". If the array part contains more than one slash quote the whole thing then print the array part out.
Here is what I have so far:
#!/usr/bin/ksh
#DN=/cn=Printer1 Building 1/ou=HR/dc=N/A/dc=fabrikam/dc=com
DN=/cn=Printer1/ou=HR/dc=N/A/dc=fabrikam/dc=com
# Get the number of "=" in the DN and add 1 for the last segment
echo $DN|sed 's/\=/ EQUALS /g'|tr ' ' '\012'|sort|uniq -c|grep EQUALS>count
# this needs to be fixed to include # > 9 - works for now
VAL="$(cut -c4 count)"
VAL=$((VAL+1))
echo $DN | awk -v val=$VAL '{split($1, dnstring, "=");
for (i = 1; i <= val; i++)
print dnstring[i]}'
exit 0
As I have said, any help and/or advice is appreciated.
Thank you very much tmarikle for your suggestions and help. I did have a minor problem with the quotes following the slash in the string per your suggestion, but resolved that. Once again - thank you to all who helped.
Here is my final function - for posterity's sake.
#--------------------------------
# function _quoteDN
#
# Purpose: Takes DN input and quotes the DN string values.
# This function was designed specifically to handle a "/" within a value.
#
# Example input: /cn=Printer1 Building 1/ou=HR/dc=N/A/dc=fabrikam/dc=com
# output: /cn="Printer1 Building 1"/ou="HR"/dc="N/A"/dc="fabrikam"/dc="com"
#
#-----------------------------------
function _quoteDN () {
DN="$@"
print "$DN" | awk -F/ '
BEGIN {
PLINE=""
gsub(/"/,"")
}
{
for (i=2; i<=NF; i++) {
if (i <= (NF-1) && match($(i+1),"=")==0) {
gsub(/=/, "=\"", $i)
PLINE = PLINE "/" $i"/"$(i+1) "\""
$(i+1)=""
i++
}
else
gsub(/=/, "=\"", $i)
if ($i != "") {
PLINE = PLINE "/" $i "\""
}
else
PLINE = PLINE $i
}
}
END { echo PLINE }'
return
}