Usando sed:
$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//"
o-wor
Dentro del comando sed, el ^
carácter coincide con el texto que comienza con $prefix
, y el final $
coincide con el texto que termina con $suffix
.
Adrian Frühwirth hace algunos buenos puntos en los comentarios a continuación, pero sed
para este propósito puede ser muy útil. El hecho de que los contenidos de $ prefix y $ suffix son interpretados por sed puede ser bueno o malo, siempre que prestes atención, deberías estar bien. La belleza es que puedes hacer algo como esto:
$ prefix='^.*ll'
$ suffix='ld$'
$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//"
o-wor
que puede ser lo que quieras, y es más elegante y más poderoso que la sustitución de variables bash. Si recuerdas que con un gran poder viene una gran responsabilidad (como dice Spiderman), deberías estar bien.
Se puede encontrar una introducción rápida a sed en http://evc-cit.info/cit052/sed_tutorial.html
Una nota sobre el shell y su uso de cadenas:
Para el ejemplo particular dado, lo siguiente funcionaría también:
$ echo $string | sed -e s/^$prefix// -e s/$suffix$//
... pero solo porque:
- echo no le importa cuántas cadenas hay en su lista de argumentos, y
- No hay espacios en $ prefix y $ suffix
En general, es una buena práctica citar una cadena en la línea de comando porque incluso si contiene espacios, se presentará al comando como un argumento único. Citamos $ prefix y $ suffix por la misma razón: cada comando de edición para sed se pasará como una cadena. Usamos comillas dobles porque permiten la interpolación variable; Si hubiéramos usado comillas simples, el comando sed habría obtenido un literal $prefix
y $suffix
que ciertamente no es lo que queríamos.
Observe también mi uso de comillas simples al establecer las variables prefix
y suffix
. Ciertamente no queremos que se interprete nada en las cadenas, por lo que las citamos con una sola cita para que no se realice ninguna interpolación. De nuevo, puede que no sea necesario en este ejemplo, pero es un muy buen hábito.