X-Git-Url: https://git.plutz.net/?p=confetti;a=blobdiff_plain;f=pdiread.sh;h=6f15658dc912c72a187c1559328e1e77a763b741;hp=d2eb9fa2501b30cbf4eeed78fd93d87513d0505f;hb=bbce2c9717ad8e0f551ac0d875801d2da3be3b53;hpb=db7a64bb18b94e041398560bb2dae6eb8f13855e diff --git a/pdiread.sh b/pdiread.sh index d2eb9fa..6f15658 100755 --- a/pdiread.sh +++ b/pdiread.sh @@ -27,7 +27,12 @@ BR=' ' pdi_load() { - sed -En ' + # 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 -srn ' # === Read entire file into buffer === :X $bY; N; bX; :Y s;^.*$;\n&\n;; @@ -51,7 +56,7 @@ pdi_load() { # === Unscramble aggregated fields === :disag - s;\n([^:]+:)((.*[^\])?(\\\\)*),;\n\1\2\n\1;; + s;\n([^:\n]+:)(([^\n]*[^\])?(\\\\)*),;\n\1\2\n\1;; t disag; # === Insert FN when only N is present === @@ -95,7 +100,7 @@ pdi_load() { # === Update obsolete LABEL property === s;\nLABEL((\;[A-Za-z0-9-]+|\;[A-Za-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):(.*)\n;\nADR\1\;LABEL="\5":\n;g; - p;' "$1" + p;' "$@" } pdi_count(){ @@ -109,13 +114,31 @@ pdi_count(){ } pdi_attrib(){ - local card=":$1" name="$2" cnt="${3:-1}" + local card=":$1" name="$2" cnt="${3:-1}" attr="$4" while [ $cnt -gt 0 ]; do [ "${card#*${BR}${name};}" = "$card" ] && return 1 card="${card#*${BR}${name};}" cnt=$((cnt - 1)) done - printf %s\\n "${card%%:*}" + card="${card%%:*}" + if [ "$attr" ]; then + case $card in + *\;"$attr"=*) card="${card#*;${attr}=}";; + "$attr"=*) card="${card#${attr}=}";; + "$attr"|*\;"$attr"|"$attr"\;*|*\;"$attr"\;*) return 0;; + *) return 1;; + esac + case $card in + \"*\"\;*|\'*\'\;*) + card="${card#[\"\']}"; card="${card%%[\"\'];*}" + ;; + \"*\"|\'*\') + card="${card#[\"\']}"; card="${card%%[\"\']}" + ;; + *\;*) card="${card%%;*}";; + esac + fi + printf %s\\n "${card}" } pdi_value(){ @@ -132,7 +155,7 @@ 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}" + printf '%s\n%s;:' "${card%${BR}END;:VCARD*}" "${name}" card="${BR}END;:VCARD" break; else @@ -143,6 +166,21 @@ pdi_update_value(){ fi cnt=$((cnt - 1)) done - printf '%s\n' "$val" - printf '%s\n' "${card#*${BR}}" + 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#*:}" }