Saya sudah membaca beberapa pertanyaan manipulasi piping bash string tetapi mereka tampaknya aplikasi khusus.
Pada dasarnya, apakah ada cara untuk melakukan hal di bawah ini dengan lebih sederhana?
dari pada
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
sesuatu seperti
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Sunting Saya tertarik untuk tetap berada dalam manipulasi bash jika memungkinkan untuk mempertahankan kecepatan (bukan sed / awk yang memiliki kecenderungan untuk sangat memperlambat skrip saya)
Sunting2: @jimmij
Saya suka contoh kedua dan menuntun saya untuk membuat suatu fungsi.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
manual, maka kebalikannya benar karena waktu pemijahan proses dapat diabaikan dibandingkan dengan waktu manipulasi string yangsed
danawk
berdedikasi. Jika string sangat panjang, katakan manual bash keseluruhan, maka bash bisa menolak untuk melanjutkan sama sekali, karena beberapa batasan internal.sed
,awk
,tr
atau serupa. Lihatlah jawaban gena2x, yang saya edit beberapa waktu lalu dengan menambahkan informasi ini: unix.stackexchange.com/questions/162221/... Anda mungkin ingin membandingkannya dengan jawaban terdon untuk pertanyaan yang sama di mana ia memberikan waktu untuk string pendek di mana proses kasus pemijahan membutuhkan waktu paling lama. Anda dapat mengujinya sendiri dan memposting hasilnya.read x; echo $x
ini lebih baik untuk kinerja? Sintaksnya tidak terlihat lebih pendek atau lebih bersih.x=${x// /_}; x=${x^^}
adalah cara yang jauh lebih ringkas untuk melakukan hal yang sama seperti{read x; echo ${x...
. Sejauh kinerja berjalan, @jimmij telah menunjukkan bahwatr
/sed
akan lebih cepat daripadabash
, perhitungan garpu sama. Menggunakan pipa selalu menghasilkan proses ekstra sehingga argumen menyimpan garpu tidak lagi berlaku. Jadi, jika menggunakan pipa, gunakansed
/tr
dll. Jika Anda dapat melakukannya di bash, lakukan dan lewatiread x; echo $x
omong kosong ini .Jawaban:
Apa kata jimmij. Contoh terakhirnya adalah yang paling dekat dengan apa yang Anda coba dalam ekspresi pipa Anda.
Inilah varian dari tema itu:
Saya akan cenderung menggunakan
tr
, karena cukup cepat.Saya kira itu memalukan bahwa bash tidak mengizinkan ekspansi parameter bersarang; OTOH, penggunaan ekspresi bersarang seperti itu dapat dengan mudah menyebabkan kode yang menyakitkan untuk dibaca. Kecuali Anda benar - benar membutuhkan hal-hal untuk berjalan secepat mungkin, lebih baik menulis kode yang mudah dibaca, dipahami, dan dipelihara, daripada kode yang tampak pintar yang merupakan PITA untuk di-debug. Dan jika Anda benar - benar membutuhkan hal-hal yang harus dilakukan dengan kecepatan tinggi, Anda harus menggunakan kode kompilasi, bukan skrip.
sumber
Anda tidak dapat melewatkan ekspansi parameter sedemikian rupa. Ketika Anda merujuk
x
menggunakan$
simbol seperti dalam"${x}"
formulir, maka itu harus nama variabel nyata, bukan input standar, setidaknya tidak dalambash
. Di dalamzsh
Anda dapat melakukan substitusi parameter bersarang dengan cara berikut:(catatan:
:u
adalah untukzsh
sama seperti^^
untukbash
)Bersarang di bash tidak mungkin dan saya pikir apa yang Anda tulis dalam pertanyaan adalah yang terbaik yang bisa didapat, tetapi jika karena alasan aneh Anda perlu melibatkan pipa ke dalam persamaan maka Anda mungkin ingin mencoba ini:
sumber
tr
/sed
lebih cepat daribash
pada pemrosesan string, dan mempertimbangkan bagaimana Anda menggunakan pipa untuk melewati string melalui standar I / O, saya benar-benar melihat titik untuk melakukan operasi-operasi tersebut di bash sebagai lawan daritr
/sed
. Mengapa orang yang| { read x; echo $x... }
bertentangan dengan| sed
yang melakukan hal yang sama?echo
danread
bash built-in, jadi pada prinsipnya sedikit lebih cepat). Seperti yang sudah saya tulis dalam manipulasi parameter jawaban progresif yang OP miliki dalam pertanyaan adalah yang terbaik yang bisa saya dapatkan dari pendapat saya untuk tugas ini di bash. Pokoknya masalahnya agak akademis.