X-Git-Url: https://git.plutz.net/?p=confetti;a=blobdiff_plain;f=pdiread.sh;h=d774ada3caedba752d1271aa1bc8ceacc662b5d5;hp=89523d06ea43edc91c7b48aa18baf9b618b8363c;hb=ad105acdefe3a76de9abdfd3376527d1960bddc2;hpb=4a445e41cc1395fddeac0f9d080a5366249d1ea8 diff --git a/pdiread.sh b/pdiread.sh index 89523d0..d774ada 100755 --- a/pdiread.sh +++ b/pdiread.sh @@ -27,13 +27,18 @@ BR=' ' pdi_load() { + # normalise PDI file for processing with pdi_* functions + # functions in this library can only be applied to normalised data + # Usage example: + # data="$(pdi_load file.vcf)" + sed -En ' # === Read entire file into buffer === :X $bY; N; bX; :Y s;^.*$;\n&\n;; # === Join continuing lines, strip trailing CRs === - s;\r\n[ \t];;g; - s;\r\n;\n;g; + s;\r*\n[ \t];;g; + s;\r*\n;\n;g; # === turn property names to upper case, strip group names === s;\n([^;:\.\n]+\.)([^;:\n]+);\n\2;g; @@ -120,10 +125,44 @@ pdi_attrib(){ pdi_value(){ local card="${BR}$1" name="$2" cnt="${3:-1}" - while [ $cnt -gt 0 ]; do + while [ "$cnt" -gt 0 ]; do [ "${card#*${BR}${name};*:}" = "$card" ] && return 1 card="${card#*${BR}${name};*:}" cnt=$((cnt - 1)) done printf %s\\n "${card%%${BR}*}" } + +pdi_update_value(){ + local card="${BR}$1" name="$2" cnt="$3" val="$4" + while [ "$cnt" -gt 0 ]; do + if [ "${card#*${BR}${name};*:}" = "${card}" ]; then + printf '%s\n%s;:' "${card%${BR}END;:VCARD*}" "${name}" + card="${BR}END;:VCARD" + break; + else + printf '%s\n%s;' "${card%%${BR}${name};*}" "${name}" + card="${card#*${BR}${name};}" + printf '%s:' "${card%%:*}" + card="${card#*:}" + fi + cnt=$((cnt - 1)) + done + printf '%s\n%s\n' "$val" "${card#*${BR}}" +} + +pdi_update_attrib(){ + local card="${BR}$1" name="$2" cnt="$3" val="$4" + while [ "$cnt" -gt 0 ]; do + if [ "${card#*${BR}${name};*:}" = "${card}" ]; then + printf '%s\n%s;' "${card%${BR}END;:VCARD*}" "${name}" + card=":${BR}END;:VCARD" + break; + else + printf '%s\n%s;' "${card%%${BR}${name};*}" "${name}" + card="${card#*${BR}${name};}" + fi + cnt=$((cnt - 1)) + done + printf '%s:%s\n' "$val" "${card#*:}" +}