web-dev-qa-db-ja.com

パイピングbash文字列操作

私は他のいくつかのパイプbash文字列操作の質問を読みましたが、それらは特殊なアプリケーションのようです。

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

の代わりに

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

何かのようなもの

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

編集私は速度を維持するために可能であればbash操作内に留まることに興味があります(スクリプトを大幅に遅くする傾向があるsed/awkとは対照的)

Edit2:@jimmij

2番目の例が気に入って、関数を作成するようになりました。

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

Jimmijが言ったこと。彼の最後の例は、パイプされた式で試みていることに最も近いものです。

ここにそのテーマのバリエーションがあります:

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

非常に高速なので、trを使用する傾向があります。

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

Bashがネストされたパラメーターの展開を許可しないのは残念だと思います。 OTOH、このようなネストされた式を使用すると、コードが読みにくくなる可能性があります。あなたが本当にをできるだけ速く実行する必要がある場合を除いて、デバッグするためのPITAである巧妙に見えるコードよりも、読み取り、理解、および保守が簡単なコードを書く方が良いです。そして、もしあなたが本当にdo最高速で実行することが必要な場合は、コンパイルされたコードを使用する必要がありますnotスクリプト。

9
PM 2Ring

このような方法でパラメーター展開を渡すことはできません。 $フォームのように"${x}"記号を使用してxを参照する場合、標準入力ではなく、少なくともbashではなく、実際の変数名である必要があります。 。 zshでは、次の方法でネストされたパラメーターの置換を実行できます。

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

(注::uzshの場合は^^bashと同じです)

Bashでネストすることは不可能であり、私があなたが書いたものは得ることができる最高のものだと思いますが、奇妙な理由でパイプを方程式に含める必要がある場合は、これを試してみてください:

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