Como extrair “foo” de “foo-bar-baz” em bash? [duplicado]

1

Estou tentando extrair foo da string "foo-bar-baz" no bash.

Qualquer ideia de como fazer isso usando a substituição de string ou algo semelhante (sem ferramentas externas).

Eu tentei isso, mas não funcionou:

$ str="foo-bar-baz"
$ echo ${str%-*}
foo-bar

Isso também não funciona:

$ str="foo-bar-baz"
$ echo ${str#*-}
bar-baz

Alguma ideia de como obter apenas bar ?

    
por bodacydo 01.12.2015 / 07:24

3 respostas

3

$ str="foo-bar-baz"

$ echo "${str%%-*}"
foo

$ echo "${str##*-}"
baz

$ var="${str#*-}"
$ echo "$var"
bar-baz
$ echo "${var%-*}"
bar
    
por 01.12.2015 / 07:28
0

Isso pode extrair o foo da string.

$ str="foo-bar-baz"
str= ${str%-*} #this will get the part foo-bar
str= ${str%-*} #this will fetch foo from the string foo-bar
echo $str
    
por 01.12.2015 / 07:36
0

@heemayl já deu a resposta correta, mas para adicionar a referência e explicação:

De man bash :

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.  The word is expanded to produce a pattern just  as  in  pathname  expansion.   If  the  pattern
          matches a trailing portion of the expanded value of parameter, then the result of the expansion is the expanded value of parame-
          ter with the shortest matching pattern (the ‘‘%’’ case) or the longest matching pattern (the ‘‘%%’’ case) deleted.

Você estava usando apenas um único sinal % , por isso a correspondência mais curta foi removida em vez da correspondência mais longa.

E, como uma observação, li recentemente uma observação muito precisa de que as pessoas que aprendem bash e não aprendem awk geralmente acabam usando bash para tarefas de processamento de texto, onde é Atualmente e completamente a ferramenta errada . Aprendi 90% de awk (tudo menos as funções mais avançadas) em cerca de 5 horas - uma noite e uma manhã.

Se tudo o que você está fazendo é remover essa string para usar como nome de arquivo ou argumento de comando ou algo assim, é claro que tudo bem e é por isso que a funcionalidade existe em bash . No entanto, se você estiver fazendo malabarismos com strings mais avançados e complicados, eu altamente recomendo passar um dia aprendendo awk . Vai pagar várias dúzias de vezes.

(Eu mencionei isso principalmente porque suas tags fazem com que pareça provável que awk seria uma grande ajuda para você do que bash malabarismos com strings.)

    
por 01.12.2015 / 08:54