
Si tengo una variable de entorno:
$foo=/my/path/one:/my/path/two
¿Cómo puedo configurar:
$bar=${foo}/bin
dónde:
$bar=/my/path/one/bin:/my/path/two/bin
?
Hacer lo que he hecho anteriormente solo hace (no falta /bin en la primera ruta):
$bar=/my/path/one/:/my/path/two/bin
Puedo configurar esto manualmente o iterarlo en una lista, pero parecen complicados sin ningún motivo. ¿Existe una forma inteligente y sencilla de hacer esto?
Respuesta1
¿Entiendo bien? Le gustaría tener esto:
foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo
?
Respuesta2
No es el más robusto, pero quizás el más simple es simplemente reemplazar todos los dos puntos usando /bin:
la expansión de parámetros:
foo=/my/path/one:/my/path/two:/my/path/three
noo=${foo//:/\/bin:}/bin
echo $noo
/my/path/one/bin:/my/path/two/bin:/my/path/three/bin
Explicación:
La sintaxis ${foo}
le permite realizar muchos tipos de búsqueda y reemplazo en la variable. En este caso utilizamos la coincidencia de patrones, con los patrones separados por barras. Normalmente podrías hacer algo como esto:
$(foo/findme/replace}
que buscará la cadena findme
y $foo
la reemplazará con replace
.
Para intercambiar los dos puntos con x
, puede buscar con ${foo/:/x/}
pero para reemplazar todos y no solo el primero, coloque dos barras al principio. Para usar una barra diagonal en el reemplazo, debes escapar de ella con una barra invertida\/
En conjunto, eso nos da el patrón usado anteriormente (se agregaron espacios para mayor claridad, pero lo romperían en la vida real):
<find> <replace>
${foo // : / \/bin: }
El resto es historia.