Perintah tr Linux: ganti, hapus, dan ringkas karakter

Perintah tr mengganti atau menghapus karakter dari masukan standar dan dapat meringkas pengulangan karakter tertentu. Berikan isi berkas melalui pengalihan < atau pipa, karena tr tidak menerima nama berkas sebagai argumen masukan. Hasilnya ditulis ke keluaran standar, biasanya terminal.

Tr bekerja pada karakter, bukan mencari kata atau pola kalimat. Untuk penggantian berdasarkan pola teks, panduan sed dalam bahasa Inggris membahas alat yang lebih sesuai. Perhatikan pula locale, yaitu pengaturan lingkungan yang memengaruhi penafsiran kelas atau rentang karakter.

Sintaks dasar

tr [OPSI]... ARRAY1 [ARRAY2] < BERKAS_MASUKAN

OPSI, ARRAY1, ARRAY2, dan BERKAS_MASUKAN adalah penanda yang perlu diganti. ARRAY1 menyatakan karakter yang diproses; ARRAY2, jika diperlukan, menyatakan pasangan karakter penggantinya. Sebagai contoh, printf 'abba\n' | tr 'ab' 'xy' menghasilkan xyyx: a diganti x dan b diganti y, satu per satu. Tr tidak mencari string ab sebagai satu kata.

Opsi -d memakai satu array untuk penghapusan, sedangkan penggantian biasa memerlukan dua array. Contoh di sini memakai GNU tr. Periksa tr --version, tr --help, dan man tr karena implementasi serta dukungan pengodean karakter dapat berbeda.

Contoh penggantian, penghapusan, dan pengulangan

Ubah huruf kecil menjadi huruf besar

printf '%s\n' hello | tr '[:lower:]' '[:upper:]'

Hasilnya HELLO diikuti baris baru. Kelas [:lower:] menyatakan huruf kecil dan [:upper:] huruf besar. Tanda kutip menjaga agar notasi kelas diterima tr sebagai satu argumen, bukan dikembangkan shell sebagai pola nama berkas.

Untuk contoh dan skrip yang memang dibatasi pada ASCII, Anda dapat membuat locale eksplisit dengan printf '%s\n' hello | LC_ALL=C tr '[:lower:]' '[:upper:]'. Penetapan itu berlaku pada perintah tr di dalam pipa. Jangan menganggap pemakaian locale C menyediakan pengubahan kapitalisasi Unicode untuk semua bahasa.

Hapus karakter carriage return dari contoh CRLF

Buat direktori latihan kosong agar persiapan tidak menimpa data penting. Siapkan windows-lines.txt dengan printf 'alpha\r\nbeta\r\n' > windows-lines.txt. Tiap baris contoh berakhir dengan pasangan CRLF, yaitu carriage return diikuti line feed. Untuk menghapus CR dan menyisakan LF, jalankan:

tr -d '\r' < windows-lines.txt

Hasilnya alpha lalu beta pada dua baris. Berkas windows-lines.txt tetap tidak berubah karena hasil baru ditampilkan, belum disimpan. Tr -d '\r' menghapus setiap CR, bukan hanya CR di ujung baris. Gunakan cara ini jika semua CR memang boleh dihapus; pada berkas yang hanya memakai CR sebagai pemisah baris, penghapusan akan menghilangkan batas baris tersebut.

Ringkas spasi yang berulang

Siapkan notes.txt dengan printf 'A\040\040\040B\t\tC\n' > notes.txt. Notasi \040 berarti satu spasi, sehingga ketiga spasi dalam contoh terlihat jelas. Setelah berkas siap, jalankan:

tr -s ' ' < notes.txt

Tiga spasi antara A dan B menjadi satu spasi, tetapi dua tab sebelum C tetap ada. Opsi -s merangkum rangkaian karakter yang sama jika karakter tersebut termasuk array yang dipilih. Bentuk -s ' ' hanya memilih spasi; program tidak otomatis mengubah semua jenis spasi putih menjadi satu karakter yang sama.

Jika yang Anda perlukan adalah mengubah tab menjadi spasi lalu meringkasnya, gunakan tr '\t' ' ' < notes.txt | tr -s ' '. Pada data latihan, hasilnya A B C diikuti baris baru. Penggantian dan peringkasan ini dapat mengubah penyelarasan kolom, sehingga periksa apakah spasi merupakan bagian penting dari format data.

Lihat hasil perubahan karakter secara langsung

Contoh berikut mengubah huruf besar ASCII menjadi huruf kecil:

printf 'HELLO 123\n' | tr '[:upper:]' '[:lower:]'

Hasilnya:

hello 123

Angka, spasi, dan baris baru tidak termasuk huruf besar pada contoh ini, sehingga tetap ada. Contoh tersebut menggambarkan penggantian karakter satu per satu. Untuk mengganti satu kata utuh atau memakai kondisi berdasarkan isi baris, pilih alat yang memahami pola teks yang Anda perlukan.

Opsi dan notasi yang sering dipakai

Opsi atau notasi Kegunaan
-d Hapus karakter dalam ARRAY1, tanpa melakukan penggantian.
-s Ringkas pengulangan karakter yang sama dari array terakhir yang ditentukan.
-c Gunakan komplemen ARRAY1, yaitu karakter yang tidak tercantum di dalamnya.
[:lower:] / [:upper:] Pasangan kelas untuk pengubahan huruf kecil dan huruf besar.
\r / \n / \t Carriage return, line feed atau baris baru, dan tab.

Komplemen berarti memilih karakter di luar array. Untuk menyisakan angka ASCII sekaligus mempertahankan batas baris, siapkan mixed.txt dengan printf 'A12 B3\nC4\n' > mixed.txt, lalu jalankan LC_ALL=C tr -cd '[:digit:]\n' < mixed.txt. Hasilnya 123 pada baris pertama dan 4 pada baris kedua. Opsi -c memilih karakter selain angka atau LF, lalu -d menghapus karakter yang terpilih.

Hal yang perlu diperhatikan

Nama berkas bukan argumen masukan tr

Jangan menulis nama berkas seolah-olah tr akan membacanya. Argumen setelah opsi dipakai sebagai array karakter. Untuk membaca berkas, gunakan pengalihan seperti tr -d '\r' < windows-lines.txt > unix-lines.txt. Periksa unix-lines.txt sebelum memakainya; pengalihan > menimpa tujuan yang sudah ada.

Jangan memakai berkas yang sama sebagai masukan dan tujuan. Pada bentuk tr -d '\r' < windows-lines.txt > windows-lines.txt, shell dapat mengosongkan berkas sebelum isinya dibaca. Gunakan nama tujuan terpisah dan cadangkan data penting sebelum mengganti berkas asal.

Array karakter bukan ekspresi reguler lengkap

Tr dapat menafsirkan notasi tertentu seperti kelas, rentang, atau karakter khusus, tetapi ARRAY1 dan ARRAY2 bukan pola ekspresi reguler umum. Penghapusan karakter a dan b menghapus setiap kemunculan kedua karakter itu, bukan hanya teks ab yang berurutan. Tulis array dalam tanda kutip agar shell tidak mengubah argumennya melalui perluasan nama berkas.

Berhati-hatilah dengan kelas spasi putih. Misalnya, printf 'A B\nC\tD\n' | LC_ALL=C tr -d '[:space:]' menghasilkan ABCD tanpa baris baru di akhir. Kelas itu mencakup LF serta tab dan spasi, sehingga batas record ikut hilang. Gunakan array yang sesuai dengan karakter yang benar-benar ingin dihapus.

Dukungan UTF-8 tidak sama dengan penggantian ASCII

Manual GNU tr menyatakan bahwa dukungan penuh tersedia untuk locale satu bita yang aman, ketika setiap bita masukan mewakili satu karakter. Karakter UTF-8 dapat terdiri dari beberapa bita, sehingga penggantian karakter non-ASCII atau penggunaan komplemen dapat memberikan hasil yang tidak Anda maksud. Locale C memberi aturan satu bita yang konsisten, tetapi tidak mengubah tr menjadi alat transliterasi Unicode.

Untuk konversi bahasa yang memerlukan pemahaman karakter Unicode, pilih alat yang mendukung pengodean dan aturan konversi tersebut, lalu uji dengan teks yang mewakili data Anda. Jangan menyimpulkan bahwa konversi semua bahasa benar hanya karena contoh HELLO berhasil.

FAQ

Bisakah saya memberi nama berkas langsung setelah tr?

Tidak sebagai argumen masukan berkas. Tr memproses masukan standar; gunakan < dengan nama berkas atau kirim data melalui pipa. Argumen karakter menentukan penggantian, penghapusan, atau peringkasan yang dilakukan.

Dokumentasi

Definisi opsi, kelas karakter, serta batasan locale tersedia dalam manual GNU tr dari proyek Coreutils, ditayangkan di man7.