#!/bin/bash set -e if [ -z "$1" ]; then source_list=/dev/stdin dest_list=/dev/stdout else source_list="$1" dest_list="$1" fi # Load the file readarray A < "$source_list" # Sort IFS=$'\n' # Stash away comments C=( $(grep -E '^#' <<< "${A[*]}" || :) ) A=( $(grep -v -E '^#' <<< "${A[*]}" || :) ) # Sort entries A=( $(LC_COLLATE=C sort -f <<< "${A[*]}") ) A=( $(uniq <<< "${A[*]}") ) # Concatenate comments and entries A=( ${C[*]} ${A[*]} ) unset IFS # Dump array back into the file if [ ${#A[@]} -ne 0 ]; then printf '%s\n' "${A[@]}" > "$dest_list" fi