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.
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.
Jawaban:
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
! ... 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:
tr " " .
Contoh:
# echo "hello world" | tr " " .
hello.world
Dari man tr
:
DESCRIPTION
Menerjemahkan, memeras, dan / atau menghapus karakter dari input standar, menulis ke output standar.
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.
string='foo bar qux'
one="${string/ /.}" # sets one to 'foo.bar qux'
all="${string// /.}" # sets all to 'foo.bar.qux'
Gunakan substitusi parameter:
string=${string// /.}
Coba ini untuk jalur:
echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'
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.
echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'
sed
. Kutipan tidak relevan.
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).