टर्मिनल के माध्यम से विशिष्ट शब्दों वाले टेक्स्ट फ़ाइल से लाइनें कैसे निकालें?


72

"बिल्ली" और "चूहे" शब्द वाले टेक्स्ट फ़ाइल से सभी लाइनों को कैसे हटाएं?


यह एक होमवर्क असाइनमेंट की तरह संदिग्ध लगता है। कृपया अपने उत्तर को अछे से लोगों के लिए पूछने के लिए याद रखें।
zwets

यह बड़ी परियोजना का एक हिस्सा है, मैं लिनक्स पर्यावरण के लिए नया हूं।
पर्सेंटएक्स

जवाबों:


100

grep पहुंच

"बिल्ली" या "चूहे" से मेल खाती लाइनों के बिना फ़ाइल की एक प्रति बनाने के लिए, कोई grepरिवर्स ( -v) और पूरे-शब्द विकल्प ( -w) के साथ उपयोग कर सकता है ।

grep -vwE "(cat|rat)" sourcefile > destinationfile

पूरे शब्द विकल्प यह सुनिश्चित करता है कि यह मेल नहीं खाएगा catsया gratefulउदाहरण के लिए। आपके शेल के आउटपुट पुनर्निर्देशन का उपयोग ( >) एक नई फ़ाइल में लिखने के लिए किया जाता है । हमें सिंटैक्स के -Eलिए विस्तारित नियमित अभिव्यक्तियों को सक्षम करने के लिए विकल्प की आवश्यकता है (one|other)

sed पहुंच

वैकल्पिक रूप से, इन-लाइन्स को हटाने के लिए एक का उपयोग कर सकते हैं sed -i:

sed -i "/\b\(cat\|rat\)\b/d" filename

\bसेट शब्द सीमाओं और dआपरेशन फ़ॉरवर्ड स्लैश के बीच अभिव्यक्ति मिलान लाइन हटा देता है। catऔर ratदोनों (one|other)सिंटेक्स द्वारा मिलान किए जा रहे हैं, हमें स्पष्ट रूप से बैकस्लैश के साथ भागने की आवश्यकता है।

युक्ति: फ़ाइल को अधिलेखित करने से पहले कमांड के आउटपुट का परीक्षण करने के sedलिए -iऑपरेटर के बिना उपयोग करें ।

( सेड के आधार पर - एक विशिष्ट स्ट्रिंग वाली लाइन हटाएं )


मुझे आश्चर्य है कि अगर स्रोत फ़ाइल से निष्कासन दोनों प्राप्त करने का एक तरीका है और फ़ाइल को मैचों के साथ उत्पन्न करता है। शायद नहीं, लेकिन यह उपयोगी होगा (जैसे जब आपको कोई ऐसी फ़ाइल मिलती है जो बहुत बड़ी हो रही है, तो आप इसे सामग्री के आधार पर विभाजित कर रहे हैं)।
श्रीधर सरनोबत

1
@ श्रीधर-सरनोबत ओह, आप कर सकते हैं। स्टडआउट की प्रतिलिपि बनाने के लिए टी और उपधारा का उपयोग करें। एक में आप फिल्टर करते हैं, दूसरे में रिवर्स। एक असंबंधित usecase में प्रदर्शित टी और उपधाराओं का उपयोग
gertvdijk

15

केवल टर्मिनल में परीक्षण करने के लिए, उपयोग करें:

sed '/[cr]at/d' file_name

फ़ाइल से उन पंक्तियों को वास्तव में निकालने के लिए, उपयोग करें:

sed -i '/[cr]at/d' file_name


0

यदि आप के साथ फ़ाइल है पर विचार करें file_nameऔर आप माउस के लिए खोज करना चाहते हैं, लेकिन माउस से कुछ पंक्तियों की तरह दूसरे शब्दों होने एक ही समय पर catऔर ratऔर आप अपने उत्पादन में उन लोगों के देखने के लिए नहीं करना चाहते हैं, तो एक तरह से यह है क्या करने के लिए -

grep -r mouse file_name | grep -vE "(cat|rat)"

0

पोर्टेबल शेल तरीका

में काम करता है /bin/sh, जो dashउबंटू पर है, साथ ही साथ ksh, और bash। थोड़ा अजीब है कि आपको caseबयान में प्रत्येक शब्द के लिए कई परीक्षण मामलों को लिखना होगा लेकिन पोर्टेबल। ऐसे मामलों के साथ काम करता है जहाँ शब्द लाइन पर, लाइन के अंत में, या लाइन के मध्य में अकेला दिखाई देता है, और जहाँ यह दूसरे शब्द का हिस्सा हो सकता है, उसे अनदेखा करता है।

#!/bin/sh
line_handler(){
   # $1 is line read, prints to stdout
    case "$1" in
        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
        rat|rat\ *|*\ rat\ *|*\ rat) true;; 
        *) printf "%s\n" "$1"
    esac
}

readlines(){
    # $1 is input file, the rest is words we want to remove
    inputfile="$1"
    shift

    while IFS= read -r line;
    do
        line_handler "$line" "$@"
    done < "$inputfile"
    [ -n "$line" ] && line_handler "$line" 
}

readlines "$@"

और यह है कि यह कैसे काम करता है:

$ cat input.txt                                                                                                                                                        
the big big fat cat
the cat who likes milk 
jumped over gray rat
concat 
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt                                                                                                                                              
concat 
this is catchy
rational
irrational
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.