Saya punya file ma.txt
dan berisi output dari ls -l
; ketika saya menjalankan tr
perintah ( tr "nik-pc" "root"
) saya mendapatkan output ini:
nik-pc@nik:~$ cat ma.txt
total 52
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 11:33 Desktop
lrwxrwxrwx 1 nik-pc nik-pc 2 Mar 8 22:54 di -> hd
drwxr-xr-x 3 nik-pc nik-pc 4096 Mar 13 13:28 Documents
drwxr-xr-x 7 nik-pc nik-pc 4096 Mar 14 18:21 Downloads
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 09:39 dwhelper
-rw-r--r-- 1 nik-pc nik-pc 2134 Mar 13 17:40 hd
-rw-r--r-- 1 nik-pc nik-pc 3 Mar 13 15:34 m
-rw-r--r-- 1 nik-pc nik-pc 0 Mar 17 19:48 ma.txt
drwxr-xr-x 3 nik-pc nik-pc 4096 Mar 13 14:58 Music
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 5 12:30 Pictures
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 5 11:44 Public
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 13 15:58 sd
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 5 11:44 Templates
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 5 11:44 Videos
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 11:33 xdm-helper
nik-pc@nik:~$ tr "nik-pc" "root" < ma.txt
tttat 52
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 11:33 Desottt
trwxrwxrwx 1 too-tt too-tt 2 Mar 8 22:54 do -> hd
drwxr-xr-x 3 too-tt too-tt 4096 Mar 13 13:28 Dttutetts
drwxr-xr-x 7 too-tt too-tt 4096 Mar 14 18:21 Dtwtttads
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 09:39 dwhetter
-rw-r--r-- 1 too-tt too-tt 2134 Mar 13 17:40 hd
-rw-r--r-- 1 too-tt too-tt 3 Mar 13 15:34 t
-rw-r--r-- 1 too-tt too-tt 0 Mar 17 19:48 ta.txt
drwxr-xr-x 3 too-tt too-tt 4096 Mar 13 14:58 Musot
drwxr-xr-x 2 too-tt too-tt 4096 Mar 5 12:30 Pottures
drwxr-xr-x 2 too-tt too-tt 4096 Mar 5 11:44 Pubtot
drwxr-xr-x 2 too-tt too-tt 4096 Mar 13 15:58 sd
drwxr-xr-x 2 too-tt too-tt 4096 Mar 5 11:44 Tetttates
drwxr-xr-x 2 too-tt too-tt 4096 Mar 5 11:44 Vodets
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 11:33 xdt-hetter
Pada baris pertama ia menggantikan "nik" dengan "terlalu" dan ejaan "Desktop" menjadi "Desottt".
Kenapa ini? Apa logika di baliknya?
command-line
tr
Manish Bharti
sumber
sumber
info coreutils 'tr invocation'
memberitahumu secara rinci apa yangtr
dilakukannya.nik-pc
denganroot
?n
juga dik-p
kisaran. Hasil karakter yang muncul lebih dari sekali pada set pertama tidak ditentukan oleh POSIX.sed
perintah ...ls -l | sed 's/nik-pc/root/'
akan melakukan apa yang Anda inginkan.tr
adalah untuk mengkonversi karakter tunggal - mis. huruf kecil ke huruf besar, atau dos-style lineshift (\ r) ke Unix-style (\ n), atau sesuatu seperti mengganti semua garis miring terbalik (Windows) dengan garis miring. Itu juga dapat menghapus karakter "yang tidak diinginkan", misalnya. semua angka atau semua huruf besar.Jawaban:
tr
menerjemahkan karakter string-bijaksana. Ini mencari huruf-huruf dari set pertama dan menggantinya dengan yang membentuk set kedua.Anda memiliki
nik-pc
set pertama.tr
perluask-p
bagian itu ke semua huruf dalam kisaran dari "k" hingga "p", sehingga himpunannya sama denganniklmnopc
.Set kedua Anda adalah
root
.Apa yang
tr
sekarang dilakukan adalah mencari semua kemunculan karakter pertama di set pertama (yang dievaluasi) dan menggantinya dengan karakter pertama set kedua. Ketika tidak ada lagi karakter di set 2, itu hanya mengulangi karakter terakhirnya. Lihat tabel di bawah ini:Jadi sekarang sudah jelas mengapa misalnya "Desktop" menjadi "Desottt". Perilaku ini sepenuhnya benar dan dimaksudkan dengan cara ini.
Apa yang Anda cari malah bisa dicapai dengan menggunakan
sed
:Sintaksnya adalah ini:
Jadi kami membiarkannya mencari pola "nik-pc" dan mengganti seluruh kecocokan dengan "root". Kita perlu menambahkan bendera "g" untuk memungkinkan penggantian global. Tanpa itu, itu hanya akan mengganti setiap pertandingan pertama per baris.
sumber
printf "A\nB\nC\n" | tr 'ABC' '12'
tr
adalah untuk menerjemahkan karakter, bukan untuk kata-kata lengkap. Itu bisa menerjemahkan set. Dalam contoh Anda, Anda memiliki "nik-pc" sebagai chars koleksi pertama, dan "root" adalah yang lain. Bahkan,k-p
adalah rentang, jadi itu mencakup semua karakter dari k ke p. Ini akan mencocokkan karakter satu per satu, jadi n akan menerjemahkan ke r, i ke o, k ke o, dan apa pun yang melebihi karakter ke 4 akan t. Itu sebabnya Anda menerjemahkan "Desktop" ke "Desottt"Anda dapat melihatnya dengan lebih jelas dalam contoh ini:
Di sini Anda dapat melihat
tr
set 1 memiliki D di posisi 4. Tetapi set 2 tidak memiliki posisi 4, sehingga akan menggunakan posisi terakhir yang ditetapkan 2 harus diterjemahkan.Apa yang Anda lakukan adalah menerjemahkan satu kata ke kata lain. Apa yang ingin Anda lakukan adalah menggunakan alat yang lebih canggih seperti
sed
atauawk
.Contohnya,
sumber