diff options
author | sinanmohd <sinan@firemail.cc> | 2023-06-30 11:26:22 +0530 |
---|---|---|
committer | sinanmohd <sinan@firemail.cc> | 2023-06-30 12:25:50 +0530 |
commit | 76f5872f5f739217caccc98ac185d8a5d24b1a95 (patch) | |
tree | 4b49ea20e852637e2440f9b0ad97288723464039 /bin/vtoc.sh | |
parent | 3d0e74fda2a137179ee4e06b7f21a7b9dafd2ecb (diff) |
vtoc.sh: initial commit, convert vcf to csv, replaces vtono.sh
Diffstat (limited to 'bin/vtoc.sh')
-rwxr-xr-x | bin/vtoc.sh | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/bin/vtoc.sh b/bin/vtoc.sh new file mode 100755 index 0000000..f2be2cb --- /dev/null +++ b/bin/vtoc.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +die() +{ + : "${1:?}" + + printf "\033[31;1merr: %b\033[0m\n" "$1" 1>&2 + exit "${2:-1}" +} + +warn() +{ + : "${1:?}" + printf "\033[33;1mwarn: %b\033[0m\n" "$*" 1>&2 +} + +######## +# MAIN # +# ###### + +name= +no= +vcf= +nos= + +if [ -z "$1" ] || + [ "$(file --brief --dereference --mime-type "$1")" != "text/vcard" ]; then + die "no or invalid input" +else + vcf="$1" + shift +fi + +strings "$vcf" | while read -r line; do + case "$line" in + 'FN:'*) + name="${line##*:}" + ;; + 'TEL;TYPE='*':'*) + # avoid repetitions in same vacrd entry + no="${line##*:}" + case "$nos" in + *"$no"*) + continue + ;; + esac + nos="${nos}:${no}" + + # make sure $no is E.164-formatted + case "$no" in + *-*) + no="$(printf "%s" "$no" | tr -d '-')" + ;; + esac + case "$no" in + +[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) + # gotta go fast \+[0-9]{12} + ;; + +974[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) # qatar + # gotta go fast \+974{8} + ;; + *) + warn "illegal format: ${name}, ${no}" + continue; + ;; + esac + + [ "$1" = "-w" ] && + continue + + [ -n "$no" ] && + printf "%s, %s\n" "$no" "$name" + ;; + 'END:VCARD') + nos= + ;; + esac +done |