Skip to content

Instantly share code, notes, and snippets.

@eatnumber1
Created June 12, 2013 10:35
Show Gist options
  • Save eatnumber1/5764292 to your computer and use it in GitHub Desktop.
Save eatnumber1/5764292 to your computer and use it in GitHub Desktop.
The script I used to migrate from LastPass to 1Password. Your mileage may vary.
#!/bin/zsh
emulate -L zsh
setopt err_exit warn_create_global no_unset
#setopt xtrace
function parse_elem {
local obj cur="$1" in_recovery="$2"
if [[ -z "$cur" ]]; then
read -r cur || return 1
ret_delim=$'\n'
fi
print -r "$cur" | IFS=',' read -r obj cur
if [[ ( $in_recovery == false && $obj[1] != "\"" ) || ( $obj[-1] == "\"" && ${#obj} != 1 ) ]]; then
parsed+=( "$obj" )
unparsed="$cur"
else
local ret_delim=","
if ! parse_elem "$cur" true; then
echo "Parse error" >&2
exit 1
fi
parsed[-1]="${obj}${ret_delim}${parsed[-1]}"
fi
}
read -r REPLY
typeset -a fields
fields=( "${(@s:,:)REPLY}" )
integer nfields=${#fields}
typeset -a parsed
typeset unparsed
typeset ret_delim
while parse_elem "$unparsed" false; do done
integer i
[[ -z "$unparsed" ]] || exit 1
for (( i = 0; i < ${#parsed} / nfields; i++ )); do
integer x
typeset -a tmp
tmp=()
for (( x = (i * nfields) + 1; x <= (i * nfields) + nfields; x++ )); do
local p="${parsed[$x]}"
if [[ $p[1] != '"' ]]; then
p=( "\"$p\"" )
fi
integer d
local temp_p=""
for (( d = 1; d < ${#p}; d++ )); do
local c="${p[$d]}"
if [[ "$c${p[$d+1]}" == '\"' ]]; then
c='\\"'
fi
temp_p+="$c"
done
p="${temp_p}${p[-1]}"
tmp+=( "$p" )
done
print -r "${(j:,:)tmp}"
done
(( x - 1 != ${#parsed} )) && exit 1
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment