किसी फ़ाइल में एक निश्चित पैटर्न या एक स्ट्रिंग के बाद शेष प्रत्येक पंक्ति को कैसे हटाएं?


21

मान लीजिए कि मेरे पास पाठ फ़ाइल में URL की एक सूची है:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

मैं '.com' के बाद आने वाली हर चीज को डिलीट करना चाहता हूं।

अपेक्षित परिणाम:

google.com
unix.stackexchange.com
isuckatunix.com

मैंने कोशिश की

sed 's/.com*//' file.txt 

लेकिन यह भी नष्ट कर दिया .com


क्या कोई विशिष्ट कारण है जिसके लिए आप .comपहले /चरित्र के बाद और उसके बाद सब कुछ हटाने के बजाय केवल खोज करना चाहते हैं ? यदि en.wikipedia.org/wiki/Ubuntuआपकी सूची में URL जैसा है तो क्या होगा ?
बाइट कमांडर

जवाबों:


17

".Com" के बाद आने वाली सभी चीज़ों को स्पष्ट रूप से हटाने के लिए, ".com" के साथ ".com (कुछ भी)" को बदलने के लिए बस अपने मौजूदा sed समाधान को ट्विक करें:।

sed 's/\.com.*/.com/' file.txt

मैंने पहली अवधि से बचने के लिए आपके रेगेक्स को ट्विक किया; अन्यथा यह "itiscommon.com/something" जैसी किसी चीज़ से मेल खाता होगा।

ध्यान दें कि आप आगे चल रहे स्लैश के साथ ".com" पैटर्न को एंकर करना चाहते हैं ताकि आप गलती से "sub.com.domain.com/foo" जैसा कुछ ट्रिम न करें:

sed 's/\.com\/.*/.com/' file.txt

9

आप निम्न तरीके से awkफ़ील्ड विभाजक ( -F) का उपयोग कर सकते हैं :

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

स्पष्टीकरण:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

जैसा कि आप हर चीज़ को हटाना चाहते हैं .com, -F '.com'लाइन को अलग करता है .comऔर print $1आउटपुट को केवल पहले भाग देता है .com। तो, $1".com"जोड़ता है .comऔर आपको अपेक्षित आउटपुट देता है।




1
@ पांड्या: यह स्ट्रिंग के साथ फेल हो जाता है जैसेacomercial.com/asdsad
cuonglm

@cuonglm इशारा करने के लिए धन्यवाद। सुधरा हुआ उत्तर
पंड्या

4

गैर-संवादात्मक इन-प्लेस फ़ाइल संपादन के लिए सबसे अच्छा उपकरण है ex

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

यदि आपने उपयोग किया है viऔर यदि आपने कभी एक कमांड टाइप किया है जो कि :आपके द्वारा पूर्व कमांड का उपयोग करने वाले एक कोलन के साथ शुरू होता है । बेशक अधिक उन्नत या "फैंसी" आदेशों में से कई आप इस तरह से निष्पादित कर सकते हैं विम एक्सटेंशन (जैसे :bufdo) हैं और पोसिक्स विनिर्देशोंex में परिभाषित नहीं हैं , लेकिन उन विशिष्टताओं को गैर-दृश्य में वास्तव में आश्चर्यजनक डिग्री शक्ति और लचीलेपन की अनुमति है पाठ संपादन (चाहे इंटरैक्टिव या स्वचालित)।

ऊपर दिए गए कमांड के कई भाग हैं।

-sexबैच उपयोग के लिए तैयार करने के लिए मूक मोड सक्षम करता है । (आउटपुट संदेश एट अल दबाएं।)

-cफ़ाइल को (एक बार file.txtइस मामले में) एक बफर में खोलने पर कमांड को निष्पादित करने के लिए निर्दिष्ट करता है ।

%एक एड्रेस 1,$स्पेसिफ़ायर के बराबर है - इसका मतलब है कि निम्नलिखित कमांड बफर के सभी लाइनों पर लागू होता है।

sस्थानापन्न आदेश है कि आप पहले से ही परिचित होने की संभावना है। आमतौर पर इसका उपयोग किया जाता है viऔर इसमें sकमांड केsed समान अनिवार्य रूप से समान विशेषताएं होती हैं , हालांकि उन्नत रेगेक्स की कुछ विशेषताएं कार्यान्वयन द्वारा भिन्न हो सकती हैं। इस स्थिति में ".com" से पंक्ति के अंत तक को ".com" से बदल दिया जाता है।

ऊर्ध्वाधर पट्टी अनुक्रमिक कमांड को निष्पादित करने के लिए अलग करती है। कई (अधिकांश) exकार्यान्वयन में आप एक अतिरिक्त -cविकल्प का उपयोग कर सकते हैं , जैसे:

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

हालाँकि, यह POSIX द्वारा आवश्यक नहीं है।

xआदेश बाहर निकलता है, फ़ाइल में कोई परिवर्तन लेखन के बाद। इसके विपरीत wqजिसका अर्थ है "लिखना और छोड़ना", xकेवल फ़ाइल को लिखता है यदि बफर संपादित किया गया है। इस प्रकार यदि आपकी फ़ाइल अनलेडेड है, तो टाइमस्टैम्प संरक्षित रहेगा।


1
प्रयोग करने के लिए +1 पूर्व
जेफ स्कालर

1
यह जगह में संपादित नहीं करता है। कम से कम, यह गगन sedके बोगस की तुलना में किसी भी अधिक नहीं करता है। यह ऑन-डिस्क बफ़र्स को पढ़ता / लिखता है। अपने लिए w / ex -rऔर preserveकमांड देखें।
16

@ mikeserv preserveकमांड क्या है ?
मतीन उल्हाक

2

बहुत जल्दी, सरल और गंदा अजगर तरीका:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

नमूना चला

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

2
क्या मैं नीचे जाने का कारण जान सकता हूँ?
सर्गी कोलोडियाज़नी

3
यह काम करता है, लेकिन यह परवाह नहीं करता है .com, यह सिर्फ /पंक्ति में पहले से शुरू होने वाली सभी चीजों को हटा देता है । (जो मेरे विचार में और भी बेहतर दृष्टिकोण है!)
बाइट कमांडर

1
@ByteCommander बिल्कुल सही! यदि डोमेन नाम है .net, तो अन्य तरीकों में डोमेन और एक्सटेंशन के बाद आने वाले हिस्से को हटाया नहीं जाएगा, इसलिए यह /विभाजक के रूप में उपयोग करने के लिए सुरक्षित है ।
सेर्गेई कोलोडियाज़नी

+1 जवाब और टिप्पणियों के लिए जो मुझे ऐसा लगता है जैसे मैं AskUbuntu.com में हूँ: D
WinEunuuchs2Unix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.