1 #!/bin/bash 2 set -e 3 if [ -z "$1" ]; then 4 source_list=/dev/stdin 5 dest_list=/dev/stdout 6 else 7 source_list="$1" 8 dest_list="$1" 9 fi 10 # Load the file 11 readarray A < "$source_list" 12 # Sort 13 IFS=$'\n' 14 # Stash away comments 15 C=( $(grep -E '^#' <<< "${A[*]}" || :) ) 16 A=( $(grep -v -E '^#' <<< "${A[*]}" || :) ) 17 # Sort entries 18 A=( $(LC_COLLATE=C sort -f <<< "${A[*]}") ) 19 A=( $(uniq <<< "${A[*]}") ) 20 # Concatenate comments and entries 21 A=( ${C[*]} ${A[*]} ) 22 unset IFS 23 # Dump array back into the file 24 if [ ${#A[@]} -ne 0 ]; then 25 printf '%s\n' "${A[@]}" > "$dest_list" 26 fi 27