Em um script bash, como posso usar “tr -d” para excluir um usuário inserido como char?

0
#!/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

Esse é o meu código. Essencialmente, estou tentando analisar um arquivo ou uma string e fazer com que o usuário escolha um caractere para excluir do texto ou string.

A chamada seria algo como:

/stripchars -r 'd' test > out

Isso removeria todas as instâncias de d do arquivo test e colocaria a nova string ou texto em out . No momento, estou apenas recebendo saídas vazias.

    
por TemuSpok 22.04.2017 / 07:25

1 resposta

2
  1. O caractere (ou conjunto ou intervalo) a ser excluído é fornecido pelo argumento -r flags, portanto, não há necessidade de read it.
  2. O nome do arquivo (se houver) é deixado no argumento posicional após o processamento da linha de comando.
  3. Não processe o arquivo quando você ainda não tiver terminado o processamento dos sinalizadores de linha de comando.
  4. A string da opção para getopts está para trás.

Solução:

#!/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

Isso seria usado como

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

(exclui todos os caracteres minúsculos em file )

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

(apaga todos os caracteres minúsculos na string dada, a menos que seja um nome de arquivo )

$ ./script -r 'a-z'

(exclui todos os caracteres minúsculos no fluxo de entrada padrão)

    
por 22.04.2017 / 08:24