Unix में tr कमांड के '-s', '-t' और '-c' विकल्प कैसे काम करते हैं?


12

मैं जिस तरह से के बारे में उलझन में हूँ -s, -tऔर -cविकल्पों में काम टीआर आदेश। जब मैं करता हूं

echo I am a good boy | tr good bad

मुझे आउटपुट मिलता है:

I am a bddd bdy

यह काफी समझ में आता है, क्योंकि इसमें oदोहराया जाता है good। के स्थान पर अंतिम संभावित परिवर्तन oहै d, और इसलिए आउटपुट।

अब जब मैं करता हूँ

echo I am a good boy | tr -s good bad

आउटपुट है

I am a bd bdy

-sविकल्प एक भी घटना में सेट 1 में प्रत्येक चरित्र के हर दोहराया घटना निचोड़ और फिर सेट 2 में इसी चरित्र है जो एक ही स्थिति में है में सेट 1 में प्रत्येक चरित्र को बदलने के लिए माना जाता है।

तो यह होना चाहिए था

I am a bad bay.

बदलाव क्यों?

इसके अलावा, जब मैं करता हूं

echo I am a good boy | tr -c good bad

मुझे मिला dddddddgoodddodd

इस उदाहरण का जिक्र करते हुए -cविकल्प कैसे काम करता है tr?

और अंत में: एक अच्छे लड़के से बुरे लड़के में खुद को कैसे बदला जाए .... :): P वह है,

echo I am a good boy | tr <something>मुझे उत्पादन के रूप में देता है I am a bad boy:।

जवाबों:


12

-s स्विच: निचोड़ें (बार-बार वर्ण हटाएं)

echo i am a good boy | tr -s good bad

उत्पादन: i am a bd bdy

पर्दे के पीछे दो चीजें हो रही हैं जो ऐसा करती हैं। सबसे पहले, यदि दूसरा तर्क trपहले से छोटा है तो 2 वें arg में अंतिम वर्ण को पहले की तरह ही लंबाई बनाने के लिए दोहराया जाता है। तो समतुल्य आदेश है:

echo i am a good boy | tr -s good badd

दूसरी बात यह है कि जब पहली दलील में पात्रों को दोहराया जाता है तो वे किसी भी पिछली घटना को दोहराते हैं (मैं दो ooएस में बात कर रहा हूं good)। यह अब कमांड को इसके बराबर बनाता है:

echo i am a good boy | tr -s god bdd

( प्रतिस्थापन में दूसरा प्रतिस्थापन oकरने के dलिए पिछले oको अधिलेखित कर देता है a, जिससे यह निरर्थक हो जाता है)

-sस्विच के बिना आउटपुट होगा

i am a bddd bdy

साथ -sस्विच tr'निचोड़ कर रख' किसी भी दोहराया अक्षर हैं जो में सूचीबद्ध हैं पिछले तर्क अंतिम आउटपुट छोड़ने:

i am a bd bdy

-c स्विच: पूरक

-cस्विच पहला तर्क के पूरक (आर्ग 1 में सूचीबद्ध नहीं सभी पात्रों यानी) मैच के लिए प्रयोग किया जाता है। परिणामस्वरूप, arg 1 में कई अक्षर (256-3) होंगे। अब, पिछले मामले के समान ही 2 arg होता है: Arg 2 का अंतिम वर्ण लंबाई या Arg 1 से मेल खाने के लिए दोहराया जाता है। इसलिए मूल कथन:

echo i am a good boy | tr -c good bad

के बराबर है:

echo i am a good boy | tr abcefhijklmnp... baddddddddddd...

(लापता को नोट करें g, oऔर dपहले सेट में, यह भी ध्यान दें कि dदूसरे सेट में हर दूसरे चरित्र को बदल देगा - अंतरिक्ष चरित्र सहित)

यही कारण है कि में i am a good boyबदल जाता हैdddddddgoodddodd

अधिक जानकारी यहाँ: http://www.linuxjournal.com/article/2563


आम तौर पर सही है, सिवाय इसके कि -sस्विच में trकिसी भी वर्ण को अंतिम तर्क से निचोड़ने का कारण बनता है tr(पहला नहीं, जैसा कि आप कहते हैं) जो इनपुट में दोहराया जाता है। यह आपके द्वारा लिंक किए गए लेख में नोट किया गया है, और मैन पेज के "विवरण" अनुभाग में अंतिम पैराग्राफ में समझाया गया है ।
रावण

4

आपकी समझ -sगलत है, यह एक वर्ण के साथ इनपुट में सेट 1 में वर्णों की बार-बार होने वाली घटनाओं को प्रतिस्थापित करता है। यह सेट को संशोधित नहीं करता है, जैसे।

echo i am a good boy | tr -s god bad

देता है

i am a bad bay

-cविकल्प की जगह इसके पूरक के साथ सेट 1 (यानी। सभी पात्रों के सेट सेट 1 में नहीं निहित)। आप उदाहरण के लिए सभी लेकिन निर्दिष्ट वर्णों को हटाने के लिए इसका उपयोग कर सकते हैं।

echo i am a good boy | tr -cd gobdy

आउटपुट

goodboy

: मुझे आपकी बात के बारे में -s विकल्प मिला है, लेकिन मेरा सवाल यह है कि, कैसे: मैं एक अच्छा लड़का हूं tr -s good bad इस प्रकार आउटपुट दे रहा है: मैं एक bd bdy हूँ यह केवल तभी संभव है जब ऐसा होता है: पहले मैं एक अच्छा लड़का हूँ मैं bddd bdy में बदल जाता हूँ, -s विकल्प कई d के सिंगल होने की घटनाओं को बदल देता है यानी: मैं एक bddd bdy हूँ तो bd bdy में बदल जाता हूँ यह वास्तव में क्या हो रहा है? कृपया मेरे लिए इसे तोड़ दो, एक ही -c विकल्प के साथ कैसे इको है मैं एक अच्छा लड़का हूँ | tr -cd gobdy यह दे रहा है: गुडबॉय

1

अन्य उत्तर कवर trकी -s, -tऔर -cविकल्पों लेकिन पूर्णता के लिए:

आपको परेशानी हो रही है क्योंकि आपने गलत टूल उठाया है।

  • tr चरित्र परिवर्तन के लिए है
  • sed धारा संपादन के लिए है।

चूंकि दोनों धारा में पात्रों के अनुक्रम हैं goodऔर एक बेहतर मैच है।badsed

echo I am a good boy | <something> मुझे इस रूप में उत्पादन देता है: I am a bad boy

$ echo I am a good boy | sed s/good/bad/g
I am a bad boy

मूल s/..../..../है। जो भी पहले नियमित अभिव्यक्ति से मेल खाता है उसे दूसरे के साथ बदल दिया जाएगा। /gअंत में झंडा वैश्विक प्रतिस्थापन के लिए इस तरह से सभी घटनाओं की सिर्फ पहली नहीं बदल दिया जाएगा है।

$ echo I am a good boy and a good boy is me. | sed s/good/bad/
I am a bad boy and a good boy is me.

$ echo I am a good boy and a good boy is me. | sed s/good/bad/g
I am a bad boy and a bad boy is me.

0

हाँ। बिल्कुल सही!

tr -s एक वर्ण के साथ दोहराए जाने वाले वर्णों के उदाहरणों को बदलता है।

(मैन पेज के माध्यम से।)

तो, यह इस प्रकार है:

यह goodकरने के लिए धर्मान्तरित bddd। दोहराया उदाहरण 3 डी के हैं।

इसलिए यह एक उदाहरण के साथ इन तीन उदाहरणों को प्रतिस्थापित करता है।

यह है कि यह bd बनाता है। :)


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