私は他のいくつかのパイプ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
tr
マニュアルで言うと、プロセスを生成する時間は、文字列操作の時間と比較して無視できるため、逆になりますsed
とawk
専用されています。文字列が極端に長い場合、bashのマニュアル全体で言うと、内部的な制限があるため、bashは完全に処理を拒否できます。
sed
、awk
、tr
または類似しました。少し前に編集したgena2xの回答を見て、この情報を正確に追加します:unix.stackexchange.com/questions/162221/…同じ質問に対するterdonの回答と比較したいかもしれません。ケースプロセスの生成には最も時間がかかります。自分でテストして結果を投稿できます。
read x; echo $x
がパフォーマンスに優れていると思いますか?構文は短くもきれいにも見えません。x=${x// /_}; x=${x^^}
と同じことを行うには、より簡潔な方法{read x; echo ${x...
です。パフォーマンスに関する限り、@ jimmijはtr
/ sed
より高速でbash
、フォーク数が等しいことを指摘しています。パイプを使用すると、常に余分なプロセスが発生するため、フォークを保存するという引数は適用されなくなります。したがって、パイプを使用している場合は、sed
/ tr
などを使用します。bashで実行できる場合は、そうし、このread x; echo $x
ナンセンスをスキップします。