ऐसी लाइनें निकालें जो किसी दिए गए पैटर्न के पैटर्न से शुरू नहीं होती हैं


11

मेरे पास एक फाइल है जिसमें इस तरह का डेटा है:

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

प्रश्न: मैं किसी भी लाइन को निकालना चाहता हूं जो निम्नलिखित स्ट्रिंग्स से शुरू नहीं होती है:

report  
-th  
-to

इसका मतलब है कि इच्छा उत्पादन उन सभी मध्य अवांछित डॉट्स और हैश को हटा देगा और इस तरह दिखाई देगा:

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

sed/ awk/ grep/ आदि कोई समाधान जो काम करेगा।

जवाबों:


15

sedजगह में फ़ाइल को संशोधित करने के लिए उपयोग करना :

sed -i '/^\(report\|-t\(h\|o\)\)/!d' your_file

यह sedपैटर्न से मेल नहीं खाने वाली सभी लाइनों को हटाने का निर्देश देता है। पैटर्न ही है ^(लाइन के शुरू), या तो द्वारा पीछा किया reportया -tद्वारा या तो पीछा किया hया o

आपको ध्यान देना चाहिए कि यह वास्तविक जगह में संशोधन नहीं है: sedएक अस्थायी बैकअप प्रतिलिपि बनाता है और इसके साथ मूल फ़ाइल को ओवरराइट करता है।

यदि आप sedमूल फ़ाइल की बैकअप प्रतिलिपि रखना चाहते हैं (जो फ़ाइल महत्वपूर्ण डेटा होने पर एक अच्छा विचार हो सकता है), -iस्विच को बैकअप फ़ाइल बनाने के लिए एक्सटेंशन दें:

sed -i'.bak' -e '/^\(report\|-t\(h\|o\)\)/!d' your_file

your_fileमूल नाम के एक बैकअप को संशोधित और बनाएगा your_file.bak

एक साइड नोट

कृपया मेरे इरादों को गलत मत समझो या इस पर अपराध मत करो, लेकिन मैंने देखा है कि आपके पास कई समान रेगेक्स / टेक्स्ट-प्रोसेसिंग प्रश्न हैं। मैं तुम्हें सीखने शुरू करने के लिए सलाह देने के लिए sed, awkऔर grepअपनी उत्पादकता अप मदद की गति को अपने दम पर। फिर से, मुझे गलत मत समझो, मैं मदद करने के लिए बहुत खुश हूँ (जैसा कि ज्यादातर लोग यहाँ हैं); यह सिर्फ इतना है कि मुझे लगता है कि आप अपने दैनिक उपयोग के लिए इन उपकरणों को लेने से बेहद लाभ के लिए खड़े हैं।

बस यह साबित करने के लिए कि आस-पास के लोग कितने मददगार हैं, नीचे दिए गए टिप्पणियों में @ slm के सुझाव पर विचार करें और किसी भी समय इस चैट रूम द्वारा प्रश्नों के लिए स्वतंत्र महसूस करें ।


1
आपकी नियमित अभिव्यक्ति अनावश्यक रूप से गूढ़ लगती है। मुझे लगता है कि आप वास्तव में अधिक पात्रों का उपयोग करते हैं यदि आपने केवल तीन विकल्पों को स्पष्ट रूप से सूचीबद्ध किया था।
nispio

1
@ मुझे पता है, लेकिन यह अधिक कुशल होने की संभावना है यदि प्रश्न में फ़ाइल बड़ी है।
जोसेफ आर।

दिलचस्प। मैंने हमेशा लंबाई या पठनीयता के संदर्भ में रेगीक्स को मापा है। मैंने निष्पादन की गति के बारे में कभी सोचा नहीं है। मुझे नहीं लगता कि मुझे इस बारे में पर्याप्त जानकारी है कि उनका मूल्यांकन कैसे किया जाता है कि क्या तेजी से होता है, लेकिन मुझे लगता है कि यह विशिष्ट भी लागू है, है ना?
22

3
जोसेफ ने मदद करने के लिए तैयार होने के बारे में जो कहा, उसे पुन: प्रसारित करते हुए, यदि आपके पास सामान्य प्रश्न हैं जो प्रश्नोत्तर शैली में फिट नहीं हैं, तो आप इस साइट के लिए चैट रूम में हमसे चैट करने की कोशिश कर सकते हैं। chat.stackexchange.com/rooms/26/unix-and-linux । हम में से कई में वहाँ 8) रहते हैं
SLM

@ इसके लिए धन्यवाद। मैं इसे अपने जवाब में जोड़ दूंगा।
जोसेफ आर।


2

का उपयोग कर sed:

sed -n -e '/^report\|^-th\|^-to/p' filename

यह बहुत बचत नहीं है, लेकिन आप -th/ -toमें जोड़ सकते हैं -t[ho]
केविन

1
@ केविन यह सच है। उनके जवाब में टिप्पणियों में जोसेफ आर। के साथ मेरी बातचीत देखें।
nispio

2

का उपयोग कर awk:

awk '/^report|^-t[ho]/' file

यह बहुत बचत नहीं है, लेकिन आप -th/ -toमें जोड़ सकते हैं -t[ho]
केविन

1

प्रश्नकर्ता ने दो बिंदु बनाए हैं:

  • "रिपोर्ट" या "-th" या "-to" से शुरू नहीं होने वाली किसी भी लाइन को हटाना चाहते हैं।
  • वांछित आउटपुट को "उन सभी मध्य अवांछित डॉट्स और हैश (एसआईसी) को हटा देना चाहिए"

समाधान, इस समय, पहले बिंदु को संबोधित करता है और इस तरह दूसरा भी। लेकिन मान लीजिए कि फ़ाइल बड़ी है और ऐसा दिखता है:

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc
anything else
.. --.
-tp ddd
-tq eee
     -  -----

ओपी के दूसरे बिंदु को संबोधित करने की जरूरत नहीं होगी?

sed -r -i.bak '/^[ |.|-]*$/d' input-file 

बस रिक्त स्थान, डॉट्स और डैश और शेष जो कुछ भी है, को बनाए रखने के लिए संभवतः अवांछित लाइनों को हटाने का काम करता है।
मुझे लगता है कि किसी भी दृष्टिकोण का जोखिम यह है कि फ़ाइल की प्रकृति ठीक से परिभाषित नहीं है।


0

पर्ल का उपयोग करना:

perl -ne 'print if /^report|^-t[ho]/' filename > newfile

या, जगह में संपादित करने के लिए (जैसे sed, perlएक अस्थायी बैकअप भी करेगा ताकि यह स्थान संपादन में सही न हो ):

perl -i.bak -ne 'print if /^report|^-t[ho]/' filename

यह मूल फ़ाइल की एक प्रतिलिपि बना filename.bakदेगा और संपादित संस्करण के साथ आपकी मूल फ़ाइल को अधिलेखित कर देगा।

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