Removendo substrings de uma variável shell

3

Eu tenho algumas cadeias de caracteres que são lidas como esta aqui

Dio - We Rock-Greatest Hits (2CD) (2004)

Eu uso isso

NewDirectoryName=${NewDirectoryName%'(" ")'* }
NewDirectoryName=${NewDirectoryName//[^A-Za-z ]/ }

e isso me dá isso:

NewDirectoryName is -> Dio We Rock Greatest Hits Cd

elimina (2CD) e (2004) , deixando-me com Cd .

O que me intriga é se remover o (2004) , então por que ele transforma (2CD) em Cd . Por que remover apenas (2 e ) e por que está mudando D para d ?

Como faço para me livrar da coisa toda para conseguir isso:

Dio We Rock Greatest Hits
    
por uxserx-bw 25.11.2015 / 15:17

1 resposta

3

Como comentei, sua primeira expansão não faz nada. A string literal (" ") não está na string, então nada é removido. Então, a segunda expansão remove todos os caracteres que não são uma letra ou um espaço. É por isso que "CD" fica. Não há nada em seu código que diminua o "d" em "CD".

Se você deseja remover todos os bits entre parênteses:

shopt -s extglob
NewDirectoryName='Dio - We Rock-Greatest Hits (2CD) (2004)'

NewDirectoryName=${NewDirectoryName//\(*([^\)])\)}
# ...................................aa........cc
# .....................................bbbbbbbb
# (a) a literal open parenthesis
# (b) zero or more non-close-parenthesis characters
# (c) a literal close parenthesis

echo ">$NewDirectoryName<"
>Dio - We Rock-Greatest Hits  <

Para remover espaços em branco à direita:

NewDirectoryName=${NewDirectoryName%%+([[:blank:]])}

Isso usa padrões de "correspondência estendida de padrões", documentados no final desta seção do manual: link

    
por 25.11.2015 / 15:50