私は他のいくつかのパイプ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ナンセンスをスキップします。