Apaga tudo antes da última barra na variável bash

1

Eu tenho uma variável myVar no bash contendo uma longa string que se parece com isso:

-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_

Desejo excluir tudo em myVar antes da última barra (incluindo a última barra) , para que myVar acabe armazenando apenas baz1234_ . Como posso remover tudo e armazenar o resultado em uma variável?

Eu encontrei soluções lidando com sed, mas elas lidam com o tratamento de arquivos, daí minha pergunta.

    
por tli 12.02.2018 / 10:03

3 respostas

4

Você deve usar bash Expansão de parâmetro para isso e usar a remoção de subcadeia do tipo ${PARAMETER##PATTERN}

From the beginning - ${PARAMETER##PATTERN}

This form is to remove the described pattern trying to match it from the beginning of the string. The ## tries to do it with the longest text matching.

Usando o seu exemplo

$ myVar='-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_'
$ echo "${myVar##*/}"
baz1234_

Como observado nos comentários, a string em questão parece ser a saída do comando ls em uma variável! que não é uma maneira ideal de script. Explique sua exigência um pouco mais claramente.

    
por 12.02.2018 / 10:13
1

Dos comentários:

I have a folder full of tar archives, each one of them containing multiple files. I loop through them as to get a specific file that starts with baz, is followed by some digits and finally with an underscore _

Então, isso é listar a saída de tar tzvf foo.tar.gz ou algo assim? Meu tar gera apenas os nomes dos arquivos com tar t ... (sem v para verbose), então você poderia fazer algo assim para obter o nome do arquivo em vez de usar o shell para processar a saída linha por linha:

tar tzf foo.tar.gz |grep -E '/baz[0-9]+_$' |sed -e 's,.*/,,'

(ou capture-o com a substituição do comando: filename=$(tar ... | sed ...) e, claro, você pode substituir o sed pela expansão do parâmetro ${filename##./} .)

    
por 12.02.2018 / 11:45
0

Solução Awk:

myVar='-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_'
myVar=$(echo "$myVar" |  awk -F '/' '{print $NF}')

No entanto, como outros apontaram, ter a saída de ls armazenada como uma variável não é uma ótima ideia - se você puder fornecer mais contexto para o script, poderemos aconselhar melhores soluções

    
por 12.02.2018 / 10:47