किसी फ़ाइल से विवरणों की प्रतिलिपि कैसे बनाएं और उन्हें एक नई फ़ाइल में कैसे पेस्ट करें?


11

मेरे पास एक फाइल है जिसमें मेरा व्यक्तिगत विवरण (.txt) है। मैं टर्मिनल के माध्यम से फ़ाइल से केवल कुछ विवरण कैसे कॉपी कर सकता हूं और उन्हें एक नई .txtफाइल में डाल सकता हूं ?

उदाहरण के लिए, यदि यह फ़ाइल की सामग्री है:

name : farah age : 23 phone number : 0123 education : degree

मैं केवल आयु और फ़ोन नंबर की प्रतिलिपि कैसे बना सकता हूं और उन पर एक नई .txtफ़ाइल कैसे बना सकता हूं ?


2
यह इस बात पर निर्भर करता है कि आप नई फ़ाइल में क्या कॉपी करना चाहते हैं। क्या आप पहली कुछ लाइनें, आखिरी कुछ, एक स्ट्रिंग वाली लाइनें, एक स्ट्रिंग नहीं, दो तारों के बीच की लाइनें चाहते हैं? इन सभी को करने के लिए उपकरण हैं, लेकिन हमें यह जानना होगा कि आप क्या करना चाहते हैं।
17

जवाबों:


7

इसे करने बहुत सारे तरीके हैं। यदि आपकी फ़ाइल में कुछ ज्ञात संरचना है, तो आप उपयोग कर सकते हैं grepgrepआदेश खोजें एक विशिष्ट वाक्यांश और रिटर्न लाइनों है कि उस वाक्यांश से मेल के लिए एक फ़ाइल। तो अगर आपकी फ़ाइल दिखती है

नाम: सैली

जन्म तिथि: of.३१.6६

पता: १२३४ मुख्य सेंट

SSN: 123-45-6789

आप दौड़ सकते हैं grep Name info.txtऔर यह वापस आ जाएगी Name: Sally। फिर आप आउटपुट को दूसरी फ़ाइल पर रीडायरेक्ट कर सकते हैं । तो बुला रहा है

grep Name info.txt > info2.txt

नई फ़ाइल info2.txt को लाइन आउटपुट करेगा। यदि आप नई लाइनों को जोड़ना चाहते हैं, तो आप कर सकते हैं

grep Address info.txt >> info2.txt

अन्यथा फ़ाइल को अधिलेखित कर दिया जाएगा।

आप vim जैसे कमांड लाइन टेक्स्ट एडिटर का उपयोग करना भी सीख सकते हैं


2

आप उपयोग कर सकते हैं ग्रेप एक के लिए खोज करने के लिए नियमित अभिव्यक्ति में details.txt और नई फ़ाइल के लिए परिणाम अनुप्रेषित।

यदि आप जिन सभी लाइनों को कॉपी करना चाहते हैं, उनमें कुछ ऐसी चीजें हैं जो आप उपयोग नहीं कर सकते हैं:

grep "string in common" details.txt > new.txt

आप प्रत्येक पंक्ति आप, कॉपी करने के लिए अभी भी ग्रेप का उपयोग कर चाहते हैं के लिए खोज, और उन्हें संलग्न करने के लिए करना होगा नहीं new.txt का उपयोग कर >>की जगह में >


1

ऐसे संपादक भी हैं जो टर्मिनल में काम करते हैं, जैसे नैनो, vi और emacs।

यदि आप अपने स्थानीय मशीन पर एक ग्राफिकल यूजर इंटरफेस और एक रिमोट मशीन पर एक टर्मिनल का उपयोग कर रहे हैं, तो आप माउस का उपयोग एक टर्मिनल विंडो / टैब से दूसरे पर कॉपी और पेस्ट करने के लिए भी कर सकते हैं।


1

मान लें कि इनपुट फ़ाइल details.txtमें शामिल हैं:

name: farah
age: 23
phone number: 0123
education: degree

आप विस्तारित grep द्वारा लाइनों "नाम" और "फोन" का चयन कर सकते हैं।

grep -E "age:|phone number:" details.txt > new.txt

इससे नया उत्पादन होगा।

age: 23
phone number: 0123

यह काम किस प्रकार करता है:

ग्रीप प्रिंट केवल लाइनों से मेल खाते हैं। -Eविकल्प विस्तारित regexp जो करने के लिए उपयोग आप संभावना प्रदान करता है सक्षम |(वैकल्पिक)। पूरे पैटर्न को उद्धृत करना याद रखें, इसलिए |grep द्वारा व्याख्या की जाएगी। अन्यथा खोल व्याख्या करने की कोशिश करेगा। आप यहाँ यह नहीं चाहते हैं।


1

आपके द्वारा दिखाई गई फ़ाइल में एक पंक्ति में सभी विवरण हैं:

name : farah age : 23 phone number : 0123 education : degree

मैंने मान लिया है कि आप हार्ड-कोड age :आदि को कमांड में रख सकते हैं , लेकिन इसके बाद का पाठ अलग-अलग होगा, और यह कि विवरण दिए गए क्रम में नहीं हो सकता है या सन्निहित नहीं हो सकता है।

आप के साथ लाइन के कुछ हिस्सों निकाल सकते हैं grepके -oझंडा। यह पूरी लाइन के बजाय केवल मिलान किए गए भाग को प्रिंट करता है।

यदि आप age :और phone number :भागों को शामिल करना चाहते हैं , तो आप या तो -eकई मैचों को निर्दिष्ट करने के लिए या वैकल्पिक रूप से ध्वज का उपयोग कर सकते हैं ।

$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123

अभिव्यक्ति का [^ ]*अर्थ है किसी भी संख्या में वर्ण जो एक स्थान नहीं है, इसलिए यह age :अगले स्थान तक वर्णों से मेल खाता है।

fileउस फ़ाइल के नाम से बदलें जिसमें आपका विवरण है। आप >इस तरह से ऑपरेटर के साथ एक नई फ़ाइल के लिए आउटपुट पुनर्निर्देशित करके नई फ़ाइल लिख सकते हैं :

grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile

जब आप ऐसा करेंगे, तो आपको कोई आउटपुट नहीं दिखेगा। आपको पहले आउटपुट की जांच करनी चाहिए, फिर रीडायरेक्शन को जोड़ना चाहिए।

यहाँ उदाहरण के साथ प्रत्यावर्तन है। हम विस्तारित रेगेक्स का उपयोग करने के -Eलिए बताने के grepलिए ध्वज का उपयोग करते हैं । वाक्यविन्यास है (pattern1|pattern2)- यह मेल खाता है pattern1और / या pattern2। यदि या तो पाया जाता है, तो इसे मुद्रित किया जाएगा (भले ही यह पाया जाए कि क्या अन्य पाया गया है या नहीं)। अब मैं +पूर्ववर्ती चरित्र के कम से कम एक अर्थ का उपयोग कर रहा हूं , *अर्थ शून्य या पूर्ववर्ती चरित्र के बजाय । इस संदर्भ में, वे दोनों समान रूप से अच्छी तरह से काम करते हैं।

$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23 
phone number : 0123 

यदि आप भागों age :और phone number:भागों को छोड़ना चाहते हैं , तो आप -Pध्वज grepका उपयोग पर्ल-संगत नियमित अभिव्यक्तियों का उपयोग करने के लिए कह सकते हैं । यह विकल्प का समर्थन करता है, और दिए गए पैटर्न के बाद पाठ के मिलान का एक तरीका भी है :

$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123

यदि आप पाठ को अलग तरीके से प्रारूपित करना चाहते हैं, तो आप sedउदाहरण के लिए उपयोग कर सकते हैं :

$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123

यह ageपहले आने पर निर्भर करता है phone number, इसलिए यदि ऐसा नहीं है तो तदनुसार समायोजित करें। यदि आप आदेश पर भरोसा नहीं कर सकते हैं, तो आप इस बहुत जटिल कमांड का उपयोग कर सकते हैं:

$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23

यह लाइन को फिर से व्यवस्थित करता है ताकि phone number :अनुभाग हर पंक्ति पर पहले आए, फिर वांछित विवरणों का चयन करने के लिए दूसरा प्रतिस्थापन करता है। मैं यहाँ इस तकनीक का श्रेय इस उत्तर के लिए देता हूँ ।

sedपिछले स्पष्टीकरण द्वारा कवर नहीं किए गए आदेशों पर नोट्स

  • -rअधिक पठनीय आदेशों के लिए विस्तारित रेगेक्स का उपयोग करें (GNU एक ही अर्थ के साथ sedसमझता -Eहै)
  • s/old/new/के oldसाथ बदलेंnew
  • (pattern)patternबाद में \1या इसके साथ संदर्भ के लिए बचाता है \2(बाएं-से-दाएं क्रम के अनुसार) जिसमें कैप्चर समूह होते हैं - ध्यान दें कि sedइनमें से केवल 7 तक होगा!)।
  • .कोई भी चरित्र, इसलिए किसी भी वर्ण का .*प्रतिनिधित्व करता है।
  • ; शेल में, कमांड को अलग करता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.