Как я могу использовать «tr -d» в сценарии bash для удаления введенного пользователем символа?

#!/bin/bash
while getopts ":r" opt; do
    case $opt in
    r)
    [ -f "$1" ] && input="$1" || input="-"
    read $userinp
    cat $input | tr -d "$userinp"
    ;;
    esac
done

Это мой код. По сути, я пытаюсь проанализировать файл или строку и попросить пользователя выбрать символ для удаления из текста или строки.

Вызов будет выглядеть примерно так:

/stripchars -r 'd' test > out

Это удалит все экземпляры d из файла test и поместит новую строку или текст в out ]. На данный момент я получаю только пустые выходы.

0
22.04.2017, 09:57
1 ответ
  1. Символ (или набор, или диапазон) для удаления задается аргументом флагов -r, поэтому нет необходимости считывать его.
  2. Имя файла (если есть) остается в позиционном аргументе после завершения обработки командной строки.
  3. Не обрабатывать файл, если вы еще не закончили обработку флагов командной строки.
  4. Строка параметра для getopts указана наоборот.

Решение:

#!/bin/bash

# Process command line.
#   Store r-flag's argument in ch,
#   Exit on invalid flags.
while getopts 'r:' opt; do
    case "$opt" in
        r) ch="$OPTARG" ;;
        *) echo 'Error' >&2
           exit 1 ;;
    esac
done

# Make sure we got r-flag.
if [[ -z "$ch" ]]; then
    echo 'Missing -r flag' >&2
    exit 1
fi

# Shift positional parameters so that first non-flag argument
# is left in $1.
shift "$(( OPTIND - 1 ))"

if [[ -f "$1" ]] || [[ -z "$1" ]]; then
    # $1 is a (regular) file, or unset.
    # Use file for input, or stdin if unset.
    cat "${1:--}" | tr -d "$ch"
else
    # $1 is set, but not a filename, pass it as string to tr.
    tr -d "$ch" <<<"$1"
fi

Это будет использоваться как

$ ./script -r 'a-z' file

(удаляет все символы нижнего регистра в файле )

$ ./script -r 'a-z' "Hello World!"

(удаляет все символы нижнего регистра в заданной строке, если это не происходит быть именем файла)

$ ./script -r 'a-z'

(удаляет все символы нижнего регистра в стандартном потоке ввода)

1
28.01.2020, 02:46

Теги

Похожие вопросы