Eu vejo bem que você gostaria de ter isto:
foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo
?
Se eu tiver uma variável de ambiente:
$foo=/my/path/one:/my/path/two
Como posso definir:
$bar=${foo}/bin
onde:
$bar=/my/path/one/bin:/my/path/two/bin
?
Fazer o que eu fiz acima só faz (não falta / bin no primeiro caminho):
$bar=/my/path/one/:/my/path/two/bin
Eu posso definir isso manualmente ou iterar em uma lista, mas eles parecem complicados sem nenhum motivo. Existe uma maneira inteligente de fazer isso?
Eu vejo bem que você gostaria de ter isto:
foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo
?
Não o mais robusto, mas talvez o mais simples é simplesmente substituir todos os dois-pontos por /bin:
usando a expansão de parâmetro:
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
Explicação:
A sintaxe ${foo}
permite fazer vários tipos de pesquisa e substituição na variável. Neste caso, estamos usando correspondência de padrões, com os padrões separados por barras. Normalmente você pode fazer algo assim:
$(foo/findme/replace}
que procurará a string findme
em $foo
e substituirá por replace
.
Para trocar os dois-pontos com x
, você pode procurar com ${foo/:/x/}
, mas para substituir todos e não apenas o primeiro, você coloca duas barras no início. Para usar uma barra na substituição, você precisa escapar com barra invertida \/
Todos juntos, isso nos dá o padrão usado acima (espaços adicionados para clareza, mas eles quebrariam na vida real):
<find> <replace>
${foo // : / \/bin: }
O resto é história.
Tags bash