Diğer bazı boru bash dize manipülasyon soruları okudum ama onlar özel uygulamalar gibi görünüyor.
Esasen, aşağıdakileri daha basit yapmanın bir yolu var mı?
onun yerine
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
gibi bir şey
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Hızı korumak için mümkünse bash manipülasyonları içinde kalmakla ilgileniyorum (scriptlerimi büyük ölçüde yavaşlatma eğilimi olan sed / awk'ın aksine)
Edit2: @jimmij
İkinci örneği beğendim ve bir işlev yapmaya yöneldim.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
el kitabını söyleyin , o zaman tersi doğrudur, çünkü işlemlerin ortaya çıkma süresi, dize manipülasyon zamanına kıyasla ihmal edilebilir. sed
ve awk
adanmıştır. Dize çok uzunsa, tüm bash kılavuzunu söyle, o zaman bash bazı iç sınırlamalar nedeniyle tamamen ilerlemeyi reddedebilir.
sed
, awk
, tr
veya benzeri. Bir süre önce tam olarak bu bilgileri ekleyerek değiştirdiğim gena2x cevabına bakın: unix.stackexchange.com/questions/162221/… terdon cevabı ile kısa dizeler için zaman verdiği aynı soruya karşılaştırmak isteyebilirsiniz. vaka süreci yumurtlama çoğu zaman alır. Kendiniz test edebilir ve sonuç gönderebilirsiniz.
read x; echo $x
performans için daha iyi olduğunu düşünüyorsunuz ? Sözdizimi daha kısa veya daha temiz görünmüyor. x=${x// /_}; x=${x^^}
aynı şeyi yapmanın çok daha özlü bir yoludur {read x; echo ${x...
. Performansa gelince, @jimmij çatal sayısının eşit olduğunu tr
/ sed
daha hızlı olacağını belirtti bash
. Bir boru kullanmak her zaman ekstra bir işlemle sonuçlanır, böylece çatal kaydetme argümanı artık geçerli değildir. Bu nedenle, eğer boru kullanıyorsanız, sadece sed
/ tr
vb read x; echo $x
.