Apa yang terjadi
Shell (bash) melihat argumennya [a-z]
. Itu adalah pola wildcard ( gabus ), yang cocok dengan huruf kecil apa pun¹. Karenanya shell mencari nama file yang cocok dengan pola ini. Ada tiga kasus:
- Tidak ada file di direktori saat ini memiliki nama yang huruf kecil. Kemudian shell meninggalkan pola wildcard tidak berubah, dan
tr
melihat argumen -d
dan [a-z]
. Inilah yang terjadi pada sebagian besar mesin Anda.
- Satu file dalam direktori saat ini memiliki nama yang merupakan huruf kecil. Kemudian shell memperluas pola ke nama file ini, dan
tr
melihat argumen -d
dan nama file. Ini terjadi di server, dan file yang cocok dipanggil o
karena kita dapat melihat bahwa tr
menghapus surat itu o
.
- Dua atau lebih file dalam direktori saat ini memiliki nama yang huruf kecil. Kemudian shell memperluas pola ke daftar nama file yang cocok, dan
tr
melihat tiga argumen atau lebih: -d
dan nama file. Karena tr
mengharapkan satu argumen setelahnya -d
, itu akan mengeluh.
Apa yang seharusnya Anda lakukan
Jika ada karakter khusus dalam argumen perintah, Anda harus menghindarinya. Letakkan argumen dalam tanda kutip tunggal '…'
(ini adalah cara paling sederhana, ada yang lain). Di dalam kutipan tunggal, semua karakter berdiri sendiri kecuali kutipan tunggal itu sendiri. Jika ada satu kutipan di dalam argumen, gantilah dengan'\''
.
tr -d '[a-z]'
Namun perhatikan bahwa ini mungkin masih bukan yang Anda maksudkan! Ini memberitahu Anda tr
untuk menghapus huruf kecil dan tanda kurung. Ini setara dengan tr -d ']a-z['
, tr '[]a-z'
, dll Untuk menghapus huruf kecil, gunakan
tr -d a-z
Argumen untuk tr
adalah serangkaian karakter. Anda menempatkan tanda kurung di sekitar set karakter dalam ekspresi reguler atau pola wildcard untuk menunjukkan bahwa itu adalah set karakter. Tetapi tr
bekerja pada satu karakter pada satu waktu. Argumen baris perintahnya adalah apa yang Anda masukkan ke dalam tanda kurung .
Anda memang membutuhkan tanda kurung untuk menunjukkan kelas karakter . Dalam ekspresi reguler, Anda menggunakan tanda kurung di dalam tanda kurung untuk menunjukkan kelas karakter, misalnya [[:lower:]]*
cocok dengan sejumlah huruf kecil, [[:lower:]_]*
cocok dengan sejumlah huruf kecil dan garis bawah. Dalam argumen tr
, Anda memerlukan set tanpa tanda kurung di sekitarnya, jadi tr -d '[:lower:]'
hapus huruf kecil, tr -d '[:lower:]_'
hapus huruf kecil dan garis bawah, dll.
¹ Di beberapa tempat mungkin cocok dengan karakter lain .
tr
rentang ditulis tanpa melampirkan[...]
. Jaditr -d '[a-z]'
akan membunuha-z
, dan juga karakter[
dan]
. Gunakantr -d a-z
untuk membunuh hanya surata-z
.