पैटर्न से मेल खाती लाइनें कैसे निकालें और उन्हें कैसे हटाएं?


14

बहुत सी पंक्तियों वाली फ़ाइल में मैं उन पंक्तियों को हटाना चाहता हूँ, जो शुरू होती हैं HERE IT IS

केवल कमांड-लाइन टूल का उपयोग करके मैं यह कैसे कर सकता हूं?


2
हालांकि एक छोटे से अपरंपरागत, आप इस्तेमाल कर सकते हैं vimतो जैसे: vim '+g/^HERE IT IS/d' +wq test.txt;)
दरवाज़े

@Doorknob, इसे इंगित करने के लिए धन्यवाद। वास्तव में मैं vim
micgeronimo

जवाबों:


29

कोशिश करें sed:

sed -i '/^HERE IT IS/d' <file>

चेतावनी:-i स्विच का उपयोग करते समय बैकअप लेना बेहतर है sed:

sed -i.bak '/^HERE IT IS/d' <file>

मूल फ़ाइल इस प्रकार रहेगी <file>.bakऔर संशोधित फ़ाइल होगी <file>


मैं मिलान स्ट्रिंग के बाद न्यूलाइन वर्ण कैसे रख सकता हूं और न्यूलाइन को कैसे लिख सकता हूं?
माइक्रोनारिमो

2
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
heemayl

1
@micgeronimo: मदद करने के लिए खुश। कृपया मेरे संपादन जांचें।
heemayl

6
@micgeronimo उस प्रश्न को पूछने का प्रयास करें जिसे आप वास्तव में अपने मूल प्रश्न में याद रखना चाहते हैं (याद रखें कि आप इसे संपादित कर सकते हैं), बजाय टिप्पणियों के माध्यम से जो साफ हो सकते हैं / हटाए जा सकते हैं। आप उपयोग कर सकते हैं sed '/^HERE IT IS/G' file
स्टीलड्राइवर

1
दाद का उपयोग बहुत समर्थक है।
LakshyaAg

18

आपके द्वारा प्राप्त किए गए बहुत अच्छे grepऔर sedउत्तर के अलावा , यहां कुछ अन्य उपकरण हैं जो समान कार्य कर सकते हैं:

  • कुछ पर्ल तरीके:

    perl -ne '/^HERE IT IS/ || print' file > newfile
    perl -ne 'print if !/^HERE IT IS/' file > newfile
    perl -ne 'print unless /^HERE IT IS/' file > newfile
    

    आप -iफ़ाइल को संपादित करने के लिए किसी भी उदाहरण में स्विच जोड़ सकते हैं :

    perl -i.bak -ne '/^HERE IT IS/ || print' file        
    
  • (छ) awk

    awk '!/^HERE IT IS/' file > newfile
    

    GNU के नए संस्करण (4.1.1 और बाद में) awk( awkलिनक्स पर डिफ़ॉल्ट ) भी जगह में फ़ाइल को संपादित कर सकते हैं:

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • शेल ( bashऔर zsh, kshशायद, अन्य)। यह एक तरह से मूर्खतापूर्ण है, यह किया जा सकता है लेकिन अन्य उपकरण बेहतर हैं।

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    

1
आप बस दिखावा कर रहे हैं! ;;) (लेकिन आपको एक अपवोट मिला, क्योंकि यह स्मार्ट है और मैंने बहुत कुछ सीखा है और bashएक ने मुझे LOL बनाया है)
Fabby

बैश एक का उपयोग करना चाहिए printf "%s\n" "$line": व्हाट्सएप को संरक्षित करने के लिए $ लाइन को उद्धृत करना , और कुछ गूंज समस्याओं (विशेष चार्ट आदि की व्याख्या) से बचना। और जोड़ने की आवश्यकता से बचा जाता --है।
ओलिवियर दुलक

@ ऑलिवरडुलक मेला काफी मैं फ्रिंज मामलों के लिए चीजों को जटिल नहीं करना चाहता था, लेकिन चूंकि क्यूंग्लम ने जोड़ा है IFS=और -r, मैं सभी तरह से जा सकता हूं और मजबूत बना सकता हूं।
टेराडॉन

@terdon: यह सब बेहतर अच्छे ^ ^ के लिए है (और मैंने +1 पहले से ही किया था, हालाँकि, जैसा कि यह शुरुआती लोगों के लिए बहुत जानकारीपूर्ण है)
ओलिवियर दुलाक

2
@OlivierDulac मैं आपको विश्वास दिलाता हूं कि अगर मैं यूनिक्स और लिनक्स पर पोस्ट कर रहा था, तो मैंने प्रिंटफ, आईएफएस =, -आर और उद्धरण :) का उपयोग किया होगा। मैं अक्सर एयू दर्शकों के लिए चीजों को सरल करता हूं जो अक्सर कमांड लाइन के साथ कम आरामदायक होते हैं।
टेराडॉन

13

मैं grepउन्हें फ़िल्टर करने के लिए उपयोग करूंगा। उदाहरण के लिए :

grep -v "^HERE IT IS" infile > outfile

फिर आउटफिट को वापस शैशव में ले जाएं।


चतुर सोच
अनवर

5

sed निश्चित रूप से जाने का रास्ता है।

आदेश @heemayl के इस मामूली संशोधन से आपको यह पता चल जाएगा कि पैटर्न संदर्भ में I के कारण पैटर्न में एक ही मामले का उपयोग किया जाता है या नहीं।

sed -i '/HERE IT IS/Id' <file>

यदि आपके पास एक निर्देशिका में कई फाइलें थीं जो आप इस पर करना चाहते थे, तो आप इसे इस तरह से जोड़ सकते हैं।

find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +

Maxdepth विकल्प का अर्थ है कि यह निर्देशिकाओं में पुनरावृत्ति नहीं करेगा।


4

एक और अजगर विकल्प:

#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]

जहाँ f फाइल के लिए रास्ता है, उद्धरणों के बीच।


4

ग्रेप

grep -P '^(?!HERE IT IS)' file

(?!HERE IT IS)नकारात्मक लुकहेड अभिकथन जो रेगेक्स इंजन को सीमा से शुरू होने वाली सभी रेखा से मेल खाने के लिए बनाता है ( जो आमतौर पर मेल खाता है^ ) केवल अगर यह स्ट्रिंग द्वारा पीछा नहीं किया जाता हैHERE IT IS

अजगर

#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        if not line.startswith('HERE IT IS'):
            print(line, end="")

स्क्रिप्ट को किसी फ़ाइल में सहेजें, कहें script.pyऔर फिर टर्मिनल पर नीचे दिए गए कमांड के माध्यम से चलाएं।

python3 script.py infile

आप वहां रेगेक्स का उपयोग कर सकते हैं, जैसे [print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)], लेकिन यह उससे अधिक कुशल नहीं है startswith। मुझे आश्चर्य हुआ कि [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]किसी सूची में आउटपुट कैसे नहीं होगा।
अविनाश राज

पहली बार जब मैं इसमें भाग गया, तो यह मुझे अजीब लगा। यह परिभाषित सूची में सभी वस्तुओं के लिए एक प्रिंट कमांड (या आप इसके साथ जो भी कार्रवाई करना चाहते हैं) उत्पन्न करता है।
जैकब व्लिजम


1

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc 'g/^HERE IT IS/d' -cx file
  1. g वैश्विक खोज

  2. d हटाना

  3. x सहेजें और बंद करें

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