Regex no script da variável usando egrep

0

Eu estou tentando analisar a variável A_DESTINATION (um diretório) e só chamar as palavras entre o /.../

case "$TR_TORRENT_INFO" in
    *test1.com*)
    A_DESTINATION=${A_DESTINATION}/Books/
    ;;
    *test2.com*)
    A_DESTINATION=${A_DESTINATION}/Movies/
    ;;
    *test3.com*)
    A_DESTINATION=${A_DESTINATION}/Music/
    ;;
    *)
    A_DESTINATION=${A_DESTINATION}/Miscellaneous/
    ;;
esac

test="$(egrep '\/([^/.]+)\/$' $A_DESTINATION)"
echo test

Eu obtive um regex no meu script, mas ele não está retornando a pasta com êxito (ou seja, neste caso, / Miscellaneous /) no meu log. É apenas exibindo isso:

+ A_DESTINATION=/mnt/sda1/Miscellaneous/
+ egrep \/([^/.]+)\/$ /mnt/sda1/Miscellaneous/
+ test=
+ echo test
test

O que estou fazendo de errado? Obrigado!

    
por Galevux 18.02.2018 / 04:12

2 respostas

1

Em vez de adicionar um sufixo de diretório final a $A_DESTINATION e extraí-lo novamente com grep ou o que for, por que não usar apenas uma variável separada (por exemplo, $final ) na instrução case e adicioná-la a $A_DESTINATION depois? Por exemplo:

case "$TR_TORRENT_INFO" in
    *test1.com*) final='Books' ;;
    *test2.com*) final='Movies' ;;
    *test3.com*) final='Music' ;;
              *) final='Miscellaneous' ;;
esac

A_DESTINATION="$A_DESTINATION/$final/"

echo "$final"

Isso funciona, é mais simples e, IMO, também é mais fácil de ler.

BTW, as aspas simples em torno de livros, filmes, etc. não são estritamente necessárias (porque não há espaços ou metacaracteres de shell nas cadeias de caracteres), mas não atrapalham e as cadeias fixas de citação simples da IMO são boas -habit para entrar. Também é um lembrete para usar aspas simples se você quiser adicionar outro caso com um espaço no nome do diretório final (por exemplo, algo como final='Other Junk' ;; )

    
por 18.02.2018 / 10:56
0

Seguindo sugestão do steeldrive de deixar de fora / nas atribuições:

case "$TR_TORRENT_INFO" in
    *test1.com*) A_DESTINATION="$A_DESTINATION/Books"  ;;
    *test2.com*) A_DESTINATION="$A_DESTINATION/Movies" ;;
    *test3.com*) A_DESTINATION="$A_DESTINATION/Music"  ;;
    *) A_DESTINATION="$A_DESTINATION/Miscellaneous"
esac

... ou use uma variável para manter o elemento do caminho sugerido pelo , que será mais fácil ler.

Isso permitirá que você use o utilitário basename ou a substituição do parâmetro ${parameter##word} para chegar à parte final do caminho em $A_DESTINATION .

O nome de base de um nome de caminho não precisa ser um arquivo. É simplesmente a última parte de um caminho:

printf 'basename is "%s"\n' "${A_DESTINATION##*/}"

ou

printf 'basename is "%s"\n' "$( basename "$A_DESTINATION" )"

Mais tarde, quando você adiciona um nome de arquivo ao caminho, inclui o / caminho separador:

filepath="$A_DESTINATION/$filename"

Seu comando egrep :

egrep '\/([^/.]+)\/$' $A_DESTINATION

Isso instruirá egrep a ler $A_DESTINATION como um arquivo e aplicará a expressão regular dada a ele.

O seguinte teria funcionado (assumindo que não há trailing / ), mas você deve usar a solução acima mencionada:

printf '%s\n' "$A_DESTINATION" | grep -o '[^/]*$'

Não use test como o nome de uma variável, pois é também o nome de um comando padrão. Não há risco de "sobrecarregar" o comando test , mas isso poderia confundir o código.

    
por 18.02.2018 / 10:48