diff --git a/lib/ulib/ldif b/lib/ulib/ldif index bb88e21..c998830 100644 --- a/lib/ulib/ldif +++ b/lib/ulib/ldif @@ -538,19 +538,22 @@ function tl_format() { return 1 fi [ -n "$shell" ] && show_headers=1 - - local match_attr="$(def_match_attr "$@")" - local define_attrs= - local i=1 attr - for attr in "$@"; do - define_attrs="$define_attrs attrs[$i] = \"$attr\"; " - let i=$i+1 - done - awkrun -f show_headers="$show_headers" asep="$asep" vsep="$vsep" qsep="$qsep" escape="$escape" \ - shell="$shell" cmd="$cmd" begincmd="$begincmd" endcmd="$endcmd" localvars="$localvars" ' + local -a attrs mapattrs + local attr mapattr + for attr in "$@"; do + splitpair "$attr" mapattr attr + [ -n "$attr" ] || attr="$mapattr" + attr="${attr//:/}"; array_add attrs "$attr" + mapattr="${mapattr//:/}"; array_add mapattrs "$mapattr" + done + local match_attr="$(def_match_attr "${attrs[@]}")" + + awkrun -f show_headers:int="$show_headers" asep="$asep" vsep="$vsep" qsep="$qsep" escape="$escape" \ + shell:int="$shell" cmd="$cmd" begincmd="$begincmd" endcmd="$endcmd" localvars:int="$localvars" \ + attrs[@] mapattrs[@] ' function reset_values() { - for (i = 1; i <= length(attrs); i++) { + for (i = 1; i <= attrs_count; i++) { attr = norm_attr(attrs[i]) values[attr] = "" } @@ -565,21 +568,21 @@ function dump_headers() { if (shell) { if (localvars) { print "local attributes index" - for (i = 1; i <= length(attrs); i++) { - attr = norm_attr(attrs[i]) + for (i = 1; i <= attrs_count; i++) { + attr = norm_attr(mapattrs[i]) print "local " attr } } line = line "attributes=(" - for (i = 1; i <= length(attrs); i++) { - attr = norm_attr(attrs[i]) + for (i = 1; i <= attrs_count; i++) { + attr = norm_attr(mapattrs[i]) if (i > 1) line = line " " line = line quote_shell(attr) } line = line ")" } else { - for (i = 1; i <= length(attrs); i++) { - attr = attrs[i] + for (i = 1; i <= attrs_count; i++) { + attr = mapattrs[i] if (i > 1) line = line asep line = line attr } @@ -598,14 +601,14 @@ function __should_quote(s) { function dump_values(atbegin, value) { if (shell) { print "index=" nr - for (i = 1; i <= length(attrs); i++) { + for (i = 1; i <= attrs_count; i++) { attr = norm_attr(attrs[i]) print attr "=" values[attr] } if (!atbegin && cmd != "") print cmd } else { line = "" - for (i = 1; i <= length(attrs); i++) { + for (i = 1; i <= attrs_count; i++) { attr = norm_attr(attrs[i]) if (i > 1) line = line asep value = values[attr] @@ -635,7 +638,6 @@ function parse_value(line) { '"$match_attr"' BEGIN { - '"$define_attrs"' if (show_headers) dump_headers() reset_values() nr = -1 @@ -721,33 +723,33 @@ function tl_parsecsv() { awkrun -f \ basedn="$basedn" rdnattr="$rdnattr" \ - skip_lines="$skip_lines" parse_headers="$parse_headers" "headers[@]=headers" \ + skip_lines:int="$skip_lines" parse_headers:int="$parse_headers" headers[@] \ vsep="$vsep" ' -BEGIN { skip_lines = skip_lines + 0; parse_headers = parse_headers + 0 } NR <= skip_lines { next } parse_headers { array_parsecsv(headers, $0) + headers_count = array_len(headers) parse_headers = 0 next } { - array_parsecsv(attrs, $0) + array_parsecsv(attrvalues, $0) rdnindex = key_index(rdnattr, headers) - rdnvalue = attrs[rdnindex] + rdnvalue = attrvalues[rdnindex] if (basedn != "") { print "dn: " rdnattr "=" rdnvalue "," basedn } else { print "dn: " rdnvalue } - nbheaders = length(headers) - for (i = 1; i <= nbheaders; i++) { - attr = attrs[i] - split(attr, values, vsep) + for (i = 1; i <= headers_count; i++) { attr = headers[i] if (basedn == "" && attr == rdnattr) { continue # ne pas écrire deux fois le même attribut } - for (j = 1; j <= length(values); j++) { + attrvalue = attrvalues[i] + split(attrvalue, values, vsep) + values_count = array_len(values) + for (j = 1; j <= values_count; j++) { print attr ": " values[j] } } @@ -781,12 +783,12 @@ function tl_parsecsvmod() { awkrun -f \ basedn="$basedn" rdnattr="$rdnattr" \ - skip_lines="$skip_lines" parse_headers="$parse_headers" "headers[@]=headers" \ + skip_lines:int="$skip_lines" parse_headers:int="$parse_headers" headers[@] \ vsep="$vsep" ' -BEGIN { skip_lines = skip_lines + 0; parse_headers = parse_headers + 0 } NR <= skip_lines { next } parse_headers { array_parsecsv(headers, $0) + headers_count = array_len(headers) parse_headers = 0 next } @@ -794,10 +796,9 @@ parse_headers { array_parsecsv(attrvalues, $0) rdnindex = key_index(rdnattr, headers) rdnvalue = attrvalues[rdnindex] - nbheaders = length(headers) # déterminer d"abord s"il faut écrire l"objet printobj = 0 - for (i = 1; i <= nbheaders; i++) { + for (i = 1; i <= headers_count; i++) { attr = headers[i] if (attr == rdnattr) continue attrvalue = attrvalues[i] @@ -814,7 +815,7 @@ parse_headers { } # maintenant, écrire l"objet le cas échéant if (printobj) { - for (i = 1; i <= nbheaders; i++) { + for (i = 1; i <= headers_count; i++) { attr = headers[i] if (attr == rdnattr) continue attrvalue = attrvalues[i] @@ -829,7 +830,8 @@ parse_headers { } print changetype ": " attr split(attrvalue, values, vsep) - for (j = 1; j <= length(values); j++) { + values_count = array_len(values) + for (j = 1; j <= values_count; j++) { print attr ": " values[j] } print "-" @@ -898,6 +900,9 @@ awkrun [args] exemple l'option -i de sed format [options] attrs... Formater le flux au format ldif en données tabulaires. + Chaque attribut peut être de la forme newname:oldname pour avoir des + en-têtes avec un nom différent des noms des attributs. L'effet est le même + qu'avec awkcsv -m -h, --show-headers Afficher les en-têtes. Par défaut, les en-têtes ne sont pas affichés. -F ASEP