1

単一変数による文字列置換:

FOO=fooo
echo ${FOO%o}

このための出力は次のとおりfooです。

連結でこれを行う方法は?このようなもの:

FOO=fooo
echo ${FOO$FOO%o}

このための出力は(私の願い)です:fooofoo

これが可能であれば。


つまり、(変数を使用して)複数の文字列を連結してから、単一の変数だけでなく、文字列全体(すべての変数の連結)に文字列置換を適用したいと思います。

4

2 に答える 2

2

私の知る限り、単一の bash 操作としてそれを行う方法はありません。最初に変数への連結を実行し、次に必要なパラメーターの置換/展開を実行する必要があります。

FOO=foooo
TMP=$FOO$FOO  # concatenation
echo "${TMP%o}"  # parameter substitution on concatenated string

追加の var 割り当てによって読みにくくなっていると思われる場合は、同様の操作を実行する別のコマンドに出力をパイプするという効率の悪い (しかし認識しやすい) アプローチを選択できます。

[me@home]$ FOO="fooo"

[me@home]$ TMP=$FOO$FOO; echo ${TMP%o}  # bash only, with temp var
fooofoo

[me@home]]$ echo $FOO$FOO | sed 's/o$//'  # pipe to an equivalent operation
fooofoo

さらに、最終目標が何であるかによっては、それを達成するためのよりクリーンな方法があるかもしれません.

たとえば、連結に続いてトリミングが必要になる一般的な状況は、次のようなパス操作です。

[me@home]$ APP_ROOT=/opt/myapp
[me@home]$ APP_PATH=/config/hello.cfg
[me@home]$ FULL_PATH=$APP_ROOT$APP_PATH
[me@home]$ echo ${FULL_PATH%/hello.cfg}
/opt/myapp/config

その場合、「よりクリーンな」アプローチは次のようになります。

[me@home]$ dirname $APP_ROOT$APP_PATH
/opt/myapp/config

達成しようとしていることを共有できれば、もっと洗練された解決策があるかもしれません。

于 2012-12-17T17:06:08.930 に答える
0

探しているものに応じて、以下の 2 つの可能な答えを参照してください。

答え #1:

FOO=fooo
echo "${FOO}${FOO%o}"

出力:

fooofoo

答え #2:

FOO=fooo
echo "${FOO%o}${FOO%o}"

出力:

foofoo

答え #3:

FOO=fooo
CONCAT="$FOO$FOO"
echo "${CONCAT%ofooo}"

foo
于 2012-12-17T15:34:06.870 に答える