Tr bir kelimeyi diğerine nasıl çevirir?


9

Bir dosya var ma.txtve çıktı içerir ls -l; tr( tr "nik-pc" "root") komutunu çalıştırdığımda bu çıktıyı alıyorum:

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

Birinci satırda "nik" yerine "too" ifadesinin yerini aldı ve "Desktop" ın yazım şekli "Desottt" oldu.

Bu neden? Arkasındaki mantık nedir?


3
info coreutils 'tr invocation'size ne yaptığını ayrıntılı olarak anlatır tr.
Nefente

4
Bu arada ne yapmaya çalışıyorsun? Komut tam olarak yapmasını söylediğini yaptı, ama sanırım aslında nik-pconunla değiştirmek rootmi istiyorsun ?
kos

3
İlk adım daima komutun kılavuz sayfasını kontrol etmektir.
Mostafa Ahangarha

1
@DavidZ: Aralıkta nda olduğunu unutmayın k-p. İlk sette bir kereden fazla görünen karakterin sonucu POSIX tarafından belirtilmemiştir.
hmakholm Monica

1
Bence gerçekten neye ihtiyacın var, sedkomut ... ls -l | sed 's/nik-pc/root/'istediğini yapacaktı. trtek karakterleri dönüştürmek içindir - ör. küçük harf büyük harfe veya dos tarzı satır kaydırma (\ r) yerine Unix stiline (\ n) veya tüm ters eğik çizgileri (Windows) eğik çizgilerle değiştirme gibi bir şey. Ayrıca "istenmeyen" karakterleri silebilir, örn. tüm sayılar veya büyük harfler.
Baard Kopperud

Yanıtlar:


16

trkarakter dizgisini çevirir. İlk kümedeki harfleri arar ve onların yerine ikinci kümedeki harfleri koyar.

nik-pcİlk setiniz vardı . trbu k-pbölümü "k" ile "p" arasındaki tüm harflere genişletir , böylece küme eşit olur niklmnopc.

İkinci setiniz root.

Ne trşimdi yapar (değerlendirdi) ilk sette ilk karakterin tüm oluşumlarını aramak ve ikinci setin ilk karakteri ile bunları değiştirmektir. Set 2'de başka karakter kalmadığında, son karakterini tekrarlar. Aşağıdaki tabloya bakın:

n --> r
i --> o
k --> o
l --> t
m --> t
n --> t
o --> t
p --> t
c --> t

Şimdi neden "Masaüstü" nün "Desottt" haline geldiği açıktır. Davranış tamamen doğrudur ve bu şekilde tasarlanmıştır.


Bunun yerine aradığınız şey aşağıdakiler kullanılarak elde edilebilir sed:

sed 's/nik-pc/root/g' ma.txt

Sözdizimi şudur:

sed 's/SEARCH_PATTERN/REPLACE_STRING/FLAGS' INPUT_FILE

Bu yüzden "nik-pc" kalıbını aramasına ve tüm eşleşmeyi "kök" ile değiştirmesine izin veriyoruz. Genel değiştirmeyi etkinleştirmek için "g" bayrağını eklememiz gerekiyor. Bu olmadan, hat başına sadece her ilk eşleşmenin yerini alır.


Okları olan bu tablo açıklamayı daha da netleştiriyor, bunu beğendim. + 1-ed. Bir kullanıcı muhtemelen benzer bir şey yapabilirprintf "A\nB\nC\n" | tr 'ABC' '12'
Sergiy Kolodyazhnyy

18

trkarakterleri çevirmek içindir, tam kelimeler için değildir. Kümeleri çevirebilir. Örneğinizde ilk koleksiyon karakterleri olarak "nik-pc" var ve "root" başka bir karakter. Aslında, k-pbir aralıktır, bu nedenle k'den p'ye tüm karakterleri içerir. Karakterleri tek tek eşleştirecektir, bu nedenle n, r, i'den o'ya, k'den o'ya ve 4. karakterden başka her şey t'ye dönüşecektir. Bu yüzden "Masaüstü" nün "Desottt" a çevrilmiş olması

Bu örnekte daha net görebilirsiniz:

$ echo "ABCDEF" | tr "ABCDEF"  "12"                            
122222

Burada tr set 1'in D pozisyonunda 4 olduğunu görebilirsiniz . Ancak set 2'nin pozisyon 4'ü yoktur, bu yüzden set 2'nin çevirmesi gereken son pozisyonu kullanacaktır.

Yaptığınız şey bir kelimeyi diğerine çevirmektir. Yapmak istediğiniz şey, sedveya gibi daha gelişmiş bir araç kullanmaktır awk.

Örneğin,

$ ls -l /etc/passwd | awk '{gsub(/root/,"TEST");print}'        
-rw-r--r-- 1 TEST TEST 2575 Feb 29 12:30 /etc/passwd

6
VEYA sed s / nik-pc / root / g ma.txt> ma2.txt
Bruni

1
Benden çok daha hızlıydın @Serg ...: P
Bayt Komutanı

2
@ByteCommander Hız kazanmış olabilirim, ancak cevabınızın kalitesi kazanacağını düşünüyorum
Sergiy Kolodyazhnyy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.