bashビルトインを使用してサブシェルまたは関数の出力を置き換える方法


9

私は組み込みのbashサブストリングを使用して、サブシェルまたは別のbash関数の出力を置き換えようとしています。

以下のコマンドはzshで非常にうまく機能します。しかしbad substitution、bashでエラーが発生します。

${${PWD##*/}//trunk/latest}

または

${$(basename $PWD)//trunk/latest}

出力は、最後のフォルダであるべき$PWDで置き換えられ、latest私の現在のディレクトリがあるときtrunk

そうなる/home/user/trunkはずlatest

変数やパイプに依存せずに文字列エディションをチェーンできるbash同等のものはありますか?または、bashビルトインでは、入力を文字列またはプレーン変数のみにできますか?

回答:


9

いいえ、その置換演算子のネストはに固有zshです。

zshlike withで(t)csh、あなたもできることに注意してください${PWD:t:s/trunk/latest/}

けれどもbashまた、履歴の展開のために、これらのcshの履歴修飾子をサポートし、それは、そのパラメータの拡張のためにそれらをサポートしていません。

ここでbashは、一時変数を使用します。

var=${PWD##*/} var=${var//trunk/latest}

3

これをbashで試してください:

[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"

または1つのコマンドで:

[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]

結果は ${BASH_REMATCH[1]}


0

欲しいですか...?

PWD=latest

リクエストの方法がわかりません。すべての$PWDw / latest を置き換える場合はcd、最新のものにすることが最善の方法です。

[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -

...最新に移動し、パス名をstdoutに出力します。cd -もう一度行うことで、元の場所に戻ることができます。同じことをw /で行うことができます$CDPATH

mkdir -p /tmp/{1..5}  ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"

/tmp/3
/home/mikeserv
empty or unset:: /tmp/3

問題は置換自体にあるのではなくsed、いくつかのステップで達成できます。しかし、bashがサブシェルの実行を拒否し、他の文字列と同様にその内容を置き換える理由がわかりません
yabuki_joe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.