
環境変数がある場合:
$foo=/my/path/one:/my/path/two
設定方法:
$bar=${foo}/bin
どこ:
$bar=/my/path/one/bin:/my/path/two/bin
?
上記で行ったことを実行すると、次のことだけが発生します (最初のパスに /bin が存在しないわけではありません)。
$bar=/my/path/one/:/my/path/two/bin
これを手動で設定したり、リスト内で反復処理したりすることもできますが、これらは理由もなく複雑に思えます。これをワンライナーで実行できる賢い方法はありますか?
答え1
次のようなものをご希望でしょうか:
foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo
?
答え2
最も堅牢ではありませんが、おそらく最も単純なのは、/bin:
パラメータ展開を使用してすべてのコロンを置き換えることです。
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
説明:
この構文を使用する${foo}
と、変数内でさまざまな種類の検索と置換を行うことができます。この場合、パターンをスラッシュで区切ったパターン マッチングを使用します。通常は、次のようにします。
$(foo/findme/replace}
findme
内の文字列を検索し$foo
、 に置き換えますreplace
。
コロンを に置き換えるにはx
、 で検索できます${foo/:/x/}
が、最初の文字だけでなくすべてを置換するには、先頭に2つのスラッシュを入れます。置換でスラッシュを使用するには、バックスラッシュでエスケープする必要があります。\/
これらをすべて合わせると、上で使用したパターンが得られます (わかりやすくするためにスペースが追加されていますが、実際にはスペースがあるとパターンが崩れます)。
<find> <replace>
${foo // : / \/bin: }
その後は歴史が語っています。