Usando sed:
$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//"
o-wor
Dentro do comando sed, o ^caractere corresponde ao texto que começa com $prefix, e o final $corresponde ao texto que termina com $suffix.
Adrian Frühwirth faz bons comentários nos comentários abaixo, mas sedcom esse objetivo pode ser muito útil. O fato de o conteúdo do prefixo $ e do sufixo $ ser interpretado pelo sed pode ser bom ou ruim - desde que você preste atenção, você deve estar bem. A beleza é que você pode fazer algo assim:
$ prefix='^.*ll'
$ suffix='ld$'
$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//"
o-wor
que pode ser o que você deseja e é mais sofisticado e mais poderoso que a substituição de variáveis do bash. Se você se lembra que com grande poder vem uma grande responsabilidade (como o Homem-Aranha diz), você deve ficar bem.
Uma rápida introdução ao sed pode ser encontrada em http://evc-cit.info/cit052/sed_tutorial.html
Uma observação sobre o shell e seu uso de strings:
Para o exemplo específico dado, o seguinte também funcionaria:
$ echo $string | sed -e s/^$prefix// -e s/$suffix$//
... mas apenas porque:
- eco não se importa com quantas seqüências de caracteres estão em sua lista de argumentos e
- Não há espaços no prefixo $ e no sufixo $
Geralmente, é uma boa prática citar uma sequência na linha de comando porque, mesmo que contenha espaços, ela será apresentada ao comando como um único argumento. Citamos o prefixo $ e o sufixo $ pelo mesmo motivo: cada comando de edição para sed será passado como uma sequência. Usamos aspas duplas porque elas permitem interpolação variável; se tivéssemos usado aspas simples, o comando sed teria obtido um literal $prefixe $suffixque certamente não é o que queríamos.
Observe também o uso de aspas simples ao definir as variáveis prefixe suffix. Certamente, não queremos que nada nas seqüências seja interpretado, por isso as aspas simples, para que não ocorra interpolação. Novamente, pode não ser necessário neste exemplo, mas é um hábito muito bom entrar.