Yang perlu saya lakukan adalah mengganti spasi ( ) dengan titik (
.
) dalam sebuah string dalam bash.
Saya pikir ini akan sangat sederhana, tapi saya baru jadi saya tidak tahu cara memodifikasi contoh yang serupa untuk penggunaan ini.
Gunakan penggantian string shell inline. Contoh:
foo=" "
# replace first blank only
bar=${foo/ /.}
# replace all blanks
bar=${foo// /.}
Lihat http://tldp.org/LDP/abs/html/string-manipulation.html untuk lebih jelasnya.
tr
untuk string panjang. Pada sistem sayatr
mengungguli bash mulai dari string dengan lebih dari1000
karakter. Sepertinya kompleksitas waktu bash lebih buruk daripada linear. Sebuah tes kecil:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. Dengan panjang string 1M (= 2 ^ 20)tr
mengambil0.04s
dan bash 5.0.11 mengambil17s
. Dengan 2Mtr
take0.07s
(diharapkan) tetapi bash butuh69s
(4 kali lebih lama untuk dua kali panjang string).tr
! ... Tergantung pada memori yang tersedia dan sumber daya hw ... Tapi Anda benar !: Tergantung pada jenis pekerjaan yang harus dilakukan, alat khusus tetap lebih efisien!$'\n'
Anda bisa menggunakan
tr
, seperti ini:Contoh:
Dari
man tr
:sumber
Di bash, Anda bisa melakukan penggantian pola dalam string dengan
${VARIABLE//PATTERN/REPLACEMENT}
konstruk. Gunakan adil/
dan tidak//
untuk menggantikan hanya kejadian pertama. Polanya adalah pola wildcard, seperti gumpalan file.sumber
Coba ini
sumber
Gunakan substitusi parameter:
sumber
Coba ini untuk jalur:
Ini menggantikan ruang di dalam string yang dikutip ganda dengan
+
bernyanyi, lalu menggantikan+
tanda dengan backslash, lalu menghilangkan / mengganti tanda kutip ganda.Saya harus menggunakan ini untuk mengganti spasi di salah satu jalur saya di Cygwin.
sumber
sed
. Kutipan tidak relevan.