$ str="foo-bar-baz"
$ echo "${str%%-*}"
foo
$ echo "${str##*-}"
baz
$ var="${str#*-}"
$ echo "$var"
bar-baz
$ echo "${var%-*}"
bar
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
?
$ str="foo-bar-baz"
$ echo "${str%%-*}"
foo
$ echo "${str##*-}"
baz
$ var="${str#*-}"
$ echo "$var"
bar-baz
$ echo "${var%-*}"
bar
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
@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.)
Tags bash text-processing text string