パイプライン bash 文字列操作

パイプライン bash 文字列操作

別のパイプ処理されたbash文字列操作の質問について読みましたが、これはアプリケーションによって異なります。

本質的に、以下を簡単にする方法はありますか?

変える

$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD

それはまるで

$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD

編集可能な場合は、速度を維持するためにbash操作を維持することに興味があります(スクリプトの速度を大幅に低下させる傾向があるsed / awkの代わりに)。

編集2:@jimmij

私は2番目の例が好きです。これで関数を作成しました。

bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD

答え1

ジミーが言ったこと。彼の最後の例は、パイプ式で試しているものに最も近いものです。

以下はテーマのバリエーションです。

echo 'hello world'|echo $(read s;s=${s^^};echo ${s// /_})

trかなり速いのでこれを使う傾向があります。

echo 'hello world'|tr ' [:lower:]' '_[:upper:]'

bashがネストされたパラメータ拡張を許可しないのは残念です。これらの入れ子になった式を使用すると、読みやすくないコードが発生する可能性があります。そうでなければ本物できるだけ早く実行する必要がある場合はスマートに見えますが、デバッグが必要なPITAコードを書くよりも読みやすく理解しメンテナンスしやすいコードを書くことをお勧めします。もしあなたが本当にするできるだけ早く作業を完了し、コンパイルされたコードを使用する必要があります。いいえスクリプト。

答え2

このようにパラメータ拡張を渡すことはできません。フォームでxusing$シンボルを参照する場合は、"${x}"標準入力ではなく実際の変数名でなければなりません。少なくとも標準入力では、次のようにネストされたパラメータ置換を実行bashできます。zsh

$ x=''hello world'
$ echo ${${x// /_}:u}
HELLO_WORLD

(参考::uと同じ)zsh^^bash

Bashではネストできません。あなたが書いた内容が最高だと思います。ただし、奇妙な理由でパイプを方程式に組み込む必要がある場合は、次のことを試すことができます。

$ echo 'hello world' | { read x; echo "${x// /_}"; } | { read y; echo "${y^^}"; }
HELLO_WORLD

関連情報