Tr एक शब्द से दूसरे शब्द का अनुवाद कैसे करता है?


9

मेरे पास एक फ़ाइल है ma.txtऔर इसमें आउटपुट है ls -l; जब मैं trकमांड चलाता हूं ( tr "nik-pc" "root") मुझे यह आउटपुट मिलता है:

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

लाइन एक पर "नीक" को "बहुत" से बदल दिया और "डेस्कटॉप" की वर्तनी "डीसोट" बन गई।

ऐसा क्यों है? इसके पीछे तर्क क्या है?


3
info coreutils 'tr invocation'आपको बताता है कि क्या trकरता है।
नेफांटे

4
वैसे आप क्या करने की कोशिश कर रहे हैं? कमांड ने ठीक वही किया जो आपने इसे करने के लिए कहा था, लेकिन मुझे लगता है कि आप वास्तव में इसके nik-pcसाथ बदलना चाहते हैं root?
कोस

3
पहला चरण हमेशा कमांड के मैन पेज की जांच करना है।
मुस्तफा अहंगराह

1
@ डेविड: ध्यान दें कि nयह k-pरेंज में भी है । पहले सेट पर एक से अधिक बार दिखाई देने वाले चरित्र का परिणाम पोसिक्स द्वारा अनिर्दिष्ट है।
हमखोलम ने मोनिका

1
मुझे लगता है कि आपको वास्तव में क्या चाहिए, क्या sedआज्ञा है ... ls -l | sed 's/nik-pc/root/'आप जो चाहते हैं वह करेंगे। trएकल पात्रों को परिवर्तित करने के लिए है - उदाहरण के लिए। लोअर-केस टू अपर-केस, या डॉस-स्टाइल लाइन्सशिफ्ट (\ r) से यूनिक्स-स्टाइल (\ n), या स्लैश के साथ सभी बैकस्लैश (विंडोज) को बदलने जैसा कुछ। यह "अवांछित" वर्णों को भी हटा सकता है, जैसे। सभी संख्याएँ या सभी ऊपरी मामले के पत्र।
बार्ड कोपरपुड

जवाबों:


16

trस्ट्रिंग-वार का अनुवाद करता है। यह पहले सेट से अक्षरों को खोजता है और उन्हें दूसरे सेट के रूप में बदल देता है।

आपका nik-pcपहला सेट था। trउस k-pहिस्से का विस्तार "k" से "p" तक के सभी अक्षरों में होता है, इसलिए सेट समान होता है niklmnopc

आपका दूसरे सेट था root

क्या trअब करता है (का मूल्यांकन) पहले सेट में पहले वर्ण की सभी घटनाओं की खोज और उन्हें दूसरे सेट के पहले अक्षर के साथ बदलने के लिए है। जब सेट 2 में कोई और चरित्र नहीं होता है, तो यह बस अपने अंतिम चरित्र को दोहराता है। नीचे दी गई तालिका देखें:

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

तो अब यह स्पष्ट है कि क्यों "डेस्कटॉप" "Desottt" हो जाता है। व्यवहार पूरी तरह से सही है और इस तरह से इरादा है।


इसके बजाय आप जो खोज रहे हैं, उसका उपयोग करके प्राप्त किया जा सकता है sed:

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

वाक्य रचना यह है:

sed 's/SEARCH_PATTERN/REPLACE_STRING/FLAGS' INPUT_FILE

तो हम इसे "निक-पीसी" पैटर्न की खोज करते हैं और पूरे मैच को "रूट" से बदल देते हैं। वैश्विक प्रतिस्थापन को सक्षम करने के लिए हमें "जी" ध्वज जोड़ने की आवश्यकता है। इसके बिना, यह केवल प्रत्येक पहले मैच प्रति पंक्ति की जगह लेगा।


तीर के साथ वह तालिका स्पष्टीकरण को और भी स्पष्ट करती है, मुझे यह पसंद है। + 1-एड। एक उपयोगकर्ता शायद कुछ इसी तरह से बना सकता हैprintf "A\nB\nC\n" | tr 'ABC' '12'
सेर्गेई कोलोडियाज़नी

18

trवर्णों के अनुवाद के लिए है, पूर्ण शब्दों के लिए नहीं। यह सेट का अनुवाद कर सकता है। आपके उदाहरण में आपके पास पहले संग्रह वर्ण के रूप में "nik-pc" है, और "रूट" एक और है। वास्तव में, k-pएक सीमा है, इसलिए इसमें कश्मीर से लेकर पी तक सभी वर्ण शामिल हैं। यह एक-एक करके वर्णों से मेल खाएगा, इसलिए n, r से i, o से, k से o तक, और 4th char से परे जो भी होगा वह t होगा। यही कारण है कि आपके पास "डेस्‍कटॉप" का अनुवाद "डेस्कटॉप" है

आप इसे इस उदाहरण में अधिक स्पष्ट रूप से देख सकते हैं:

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

यहां आप देख सकते हैं कि tr सेट 1 में D की स्थिति 4 है। लेकिन सेट 2 की कोई स्थिति 4 नहीं है, इसलिए यह अंतिम स्थिति सेट 2 का उपयोग करना होगा जिसका अनुवाद करना है।

आप जो कर रहे हैं वह एक शब्द का दूसरे में अनुवाद कर रहा है। आप जो करना चाहते हैं, जैसे अधिक उन्नत उपकरण का उपयोग करें sedया awk

उदाहरण के लिए,

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

6
या sed s / nik-pc / root / g ma.txt> ma2.txt
ब्रूनी

1
आप थे बहुत तेजी से मुझे @Serg ...: पी
बाइट कमांडर

2
@ByteCommander मैं गति में जीत लिया है सकते हैं, लेकिन मुझे लगता है कि आपका जवाब गुणवत्ता में जीतता है
सर्गी Kolodyazhnyy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.