dividindo a string no script bash

1

Estou recebendo informações do usuário e verificando detalhes sobre isso.

Exemplo:

$HOME/Documents/test/one.txt

Eu pego a string acima como uma entrada e quero recuperar one.txt , preciso prosseguir com one.txt .

    
por Death Metal 09.10.2013 / 07:04

3 respostas

5

@Jordanm já deu a resposta canônica que funciona para qualquer string. Se você estiver lidando especificamente com caminhos, também poderá usar os programas basename e dirname :

   basename - strip directory and suffix from filenames
   dirname - strip last component from file name

Por exemplo:

$ file="$HOME/Documents/test/one.txt"
$ dir=$(dirname "$file");
$ name=$(basename "$file");
$ echo "The file called $name is in the directory $dir"
The file called one.txt is in the directory /home/terdon/Documents/test
    
por 09.10.2013 / 07:12
5

Esta é uma tarefa comum que pode ser tratada por uma expansão de parâmetro em qualquer shell POSIX.

path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt

Outro método comum é usar o programa de nome de base.

file=$(basename "$path")

A única desvantagem é ter que gerar um programa externo. A principal vantagem é que ele lida corretamente com caminhos com / .

    
por 09.10.2013 / 07:08
1

Se você estiver fazendo isso com nomes de arquivos, use o comando basename :

$ basename $HOME/Documents/test/one.txt
one.txt

Além disso:

$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt

Se você precisar dividir strings arbitrárias com delimitadores arbitrários, será um pouco mágico. Leia a string em uma matriz e defina o separador de campo de entrada para o delimitador.

Veja um exemplo:

$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt
    
por 09.10.2013 / 07:21