X-Git-Url: https://iankelling.org/git/?p=tee-unique;a=blobdiff_plain;f=teeu;h=fbeecadb12d360bb0da0789c2bacc2ecf09baa8e;hp=948169dbffdd190d66a2cb502ec0807800ef4012;hb=HEAD;hpb=ea655d17a5e11dd740574d0a1d5ca2401d5cf063 diff --git a/teeu b/teeu index 948169d..9daedb7 100755 --- a/teeu +++ b/teeu @@ -1,29 +1,56 @@ #!/bin/bash -# Copyright (C) 2014 Ian Kelling -# This program is under GPL v. 3 or later, see +# I, Ian Kelling, follow the GNU license recommendations at +# https://www.gnu.org/licenses/license-recommendations.en.html. They +# recommend that small programs, < 300 lines, be licensed under the +# Apache License 2.0. This file contains or is part of one or more small +# programs. If a small program grows beyond 300 lines, I plan to switch +# its license to GPL. + +# Copyright 2024 Ian Kelling + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + teeu() { - local help="Usage: appendu [-h|--help] FILE [LINE] - -Tee unique. Append each LINE or if none, each stdin line to FILE if it does not exist in FILE. - - [-h|--help] display this message" - - if [[ $1 == --help || $1 == -h ]]; then - echo "$help" - return - fi - - if (( ${#@} == 0 )) ; then - echo "teeu error: need 1 or more arguments" - echo "$help" - return 1 - fi - local MAPFILE - (( ${#@} >= 2 )) && MAPFILE="${@:2}" || mapfile -t - for line in "${MAPFILE[@]}"; do - grep -xFq "$line" "$1" &>/dev/null || tee -a "$1" <<<"$line" - done - return 0 + local help="Usage: teeu [-h|--help] FILE [LINE] +Append LINE if it's not already in FILE + +If no LINE is specified, process each line from STDIN. +teeu is short for tee unique. + +-h|--help display this message" + + if [[ $1 == --help || $1 == -h ]]; then + echo "$help" + return + fi + + if (( ${#@} == 0 )) ; then + echo "teeu error: need 1 or more arguments" + echo "$help" + return 1 + fi + file="$1" + shift + local MAPFILE + if [[ $1 ]]; then + MAPFILE=("$*") + else + mapfile -t + fi + for line in "${MAPFILE[@]}"; do + grep -xFq "$line" "$file" &>/dev/null || tee -a "$file" <<<"$line" + done + return 0 } teeu "$@"