Como cortar a entrada do usuário no script bash?

3

OK, aqui está uma entrada do usuário :

$ myscript.sh file-name.txt

Eu gostaria de cortar "file-name.txt" para recuperar "file" no script bash

#!/bin/bash
FILENAME=

# trim text after '-' from user input 'file-name.txt'
# save 'file' back to 

Meu melhor palpite é misturar sed e expressão regular de alguma forma, mas eu não sou especialista nisso: (

Alguma idéia?

Eu tentei a sugestão de muru para uma entrada mais complicada.

dado entrada: A-B-C-D-0.1.5-6.1.txt

queria a saída: A-B-C-D

#!/bin/bash
TRIMMED1="${1%-*}"
TRIMMED2="${1%%-*}"
TRIMMED3="${TRIMMED1%-*}"
TRIMMED4="${TRIMMED1%%-*}"
TRIMMED5="${1%-[0-9]*}"
TRIMMED6="${1%%-[0-9]*}"
echo "user input : "
echo "TRIMMED1 : $TRIMMED1"
echo "TRIMMED2 : $TRIMMED2"
echo "TRIMMED3 : $TRIMMED3"
echo "TRIMMED4 : $TRIMMED4"
echo "TRIMMED5 : $TRIMMED5"
echo "TRIMMED6 : $TRIMMED6"

resultado:

user input : A-B-C-D-0.1.5-6.1.txt
TRIMMED1 : A-B-C-D-0.1.5
TRIMMED2 : A
TRIMMED3 : A-B-C-D
TRIMMED4 : A
TRIMMED5 : A-B-C-D-0.1.5
TRIMMED6 : A-B-C-D
    
por RNA 08.06.2016 / 14:18

3 respostas

8

Você não precisa usar ferramentas externas para isso. Puta pura:

FILENAME="${1%-*}"

% é usado para remover o sufixo correspondente mais curto. Se você tiver file-name-foo , receberá file-name . Para remover o sufixo de correspondência mais longo, use %% .

Para salvar em , você precisará usar set . Algo como:

set -- "${1%-*}" "${@:2}"

Da próxima vez que você usar , ele terá o texto aparado.

Lembre-se de que não há espaços em torno de = ao atribuir variáveis.

    
por muru 08.06.2016 / 14:29
5

Você pode fazer isso

#!/bin/bash
FILENAME=
TRIMMED=$(echo "$FILENAME" | cut -f1 -d-)

O comando produzirá o campo 1 usando - como um delimitador.

    
por Pilot6 08.06.2016 / 14:22
4

Pode ser feito assim:

#!/bin/bash
# trim text after '-' from user input 'file-name.txt'
FILENAME="$(sed 's/-.*//' <<< ).txt"

# save 'file' back to 
mv "" "$FILENAME"

Explicação:

No meu exemplo, eu uso o comando sed para encurtar o nome que geralmente tem esse layout 'command/search/replacement/' . No meu exemplo acima, eu uso o comando s as que é pesquisar e substituir, então -.* como palavra de busca (regex) que pesquisará todas as combinações começando com - seguido por um caractere aleatório . e dizendo isso continua até o final com * . A string de substituição deixei vazia, isso significa que file-name.txt se torna file .

O <<< é bash específico e é chamado aqui de string, então isso não funcionará em sh . É como os redirecionamentos em arquivos apenas que redireciona uma string para o fluxo em vez de um arquivo.

Finalmente, para completar a string, adicionei .txt de volta e, em seguida, faço um mv para renomear o arquivo.

    
por Videonauth 08.06.2016 / 14:28

Tags