प्रत्येक पंक्ति के अंत में पाठ जोड़ें


92

मैं लिनक्स कमांड लाइन पर हूं और मेरे पास फाइल है

127.0.0.1
128.0.0.0
121.121.33.111

मुझे चाहिए

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

मुझे याद है कि मेरे सहकर्मी इसके लिए sed का उपयोग कर रहे थे, लेकिन sed मैनुअल पढ़ने के बाद भी यह स्पष्ट नहीं है कि इसे कमांड लाइन पर कैसे किया जाए?


2
महान सवाल और मुझे लगता है कि आप इसे कैसे तैयार करते हैं।
एंथनी रटलेज

जवाबों:


141

आप कुछ का उपयोग करके देख सकते हैं:

sed -n 's/$/:80/' ips.txt > new-ips.txt

बशर्ते आपका फ़ाइल प्रारूप वैसा ही हो जैसा आपने अपने प्रश्न में वर्णित किया है।

s///प्रतिस्थापन आदेश मैचों ( पाता ) आपकी फ़ाइल की प्रत्येक पंक्ति के अंत (का उपयोग करते हुए $चरित्र) और फिर संलग्न कर देता है ( जगह ) :80प्रत्येक पंक्ति के अंत तक। ips.txtफ़ाइल अपने इनपुट फ़ाइल है ... और new-ips.txtअपने नए बनाए गए फ़ाइल ( अपने परिवर्तनों के अंतिम परिणाम। )


इसके अलावा, यदि आपके पास आईपी नंबरों की एक सूची है जो पोर्ट नंबर के साथ पहले से जुड़ी हुई है, (जैसा कि व्लाद द्वारा दिया गया है और जैसा कि आर्गेनर द्वारा दिया गया है ,) आप कुछ इस तरह का उपयोग करने की कोशिश कर सकते हैं:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt

इसलिए, उदाहरण के लिए, यदि आपकी इनपुट फ़ाइल कुछ इस तरह दिखती है (नोट करें :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

अंतिम परिणाम कुछ इस तरह दिखेगा:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

@ व्लाद हाँ; लेकिन उदाहरण दिए गए ओपी के अनुसार ... आईपी की सूची में कोई पोर्ट नंबर नहीं होना चाहिए। :) यहां तक ​​कि अगर वहाँ थे ... ओपी s///प्रत्येक पंक्ति के अंत में किसी भी पोर्ट संख्या को बाहर निकालने के लिए पहले से ही एक और sed चला सकता है ।
सुमी

1
ठीक है, बस स्पष्ट करना ... शायद उन पंक्तियों को बाहर करने के लिए एक शर्त होनी चाहिए जहां एक बंदरगाह पहले से मौजूद है।
व्लाद

3
sed '/:[0-9]*$/ ! s/$/:80/'
18

3
इसे अपने जवाब में जोड़ें। बंदरगाहों के साथ लाइनों को बाहर करने का सुझाव यहां टिप्पणियों में पहले से ही है, मैंने केवल सटीक कमांड लिखा था।
arager

3
यदि फ़ाइल में CRLF टर्मिनेटर हैं, :80तो निम्नलिखित पंक्ति की शुरुआत में जोड़ा जाएगा। dos2unixयदि आवश्यक हो तो पहले फ़ाइल पर उपयोग करें ।
djnz0feh

16

Sed कमांड का संक्षिप्त संस्करण :

sed -i s/$/:80/ file.txt

स्पष्टीकरण:

  • sed s tream एड इटोर
    • -i मैं n- जगह (जगह में फ़ाइल संपादित करें)
    • s रों ubsteration कमांड
    • /replacement_from_reg_exp/replacement_to_text/ बयान
    • $लाइन के अंत से मेल खाता है ( प्रतिस्थापन_फ्रेम_रैग_पिक्स )
    • :80वह पाठ जिसे आप प्रत्येक पंक्ति के अंत में जोड़ना चाहते हैं ( प्रतिस्थापन_टो_टेक्स्ट )
  • file.txt फ़ाइल का नाम


12

यदि आप प्रत्येक पंक्ति के अंत में (उसी फ़ाइल में) पाठ जोड़ना चाहते हैं, तो आप -iउदाहरण के लिए, पैरामीटर का उपयोग कर सकते हैं :

sed -i'.bak' 's/$/:80/' foo.txt

तथापि -i विकल्प गैर-मानक यूनिक्स एक्सटेंशन है और सभी ऑपरेटिंग सिस्टम पर उपलब्ध नहीं हो सकता है।

तो आप उपयोग करने पर विचार कर सकते हैं ex(जो vi -e/ के बराबर है vim -e):

ex +"%s/$/:80/g" -cwq foo.txt

जो जोड़ देगा :80 प्रत्येक पंक्ति में , लेकिन कभी-कभी इसे रिक्त लाइनों में जोड़ सकता है।

इसलिए बेहतर तरीका यह है कि जाँच करें कि क्या लाइन में वास्तव में कोई संख्या है, और फिर उदाहरण के लिए इसे संलग्न करें:

ex  +"g/[0-9]/s/$/:80/g" -cwq foo.txt

यदि फ़ाइल में अधिक जटिल प्रारूप है, तो इसके बजाय उचित रेगेक्स का उपयोग करने पर विचार करें [0-9]


1

पाठ संपादक का उपयोग करना, ^Mप्रत्येक पंक्ति के अंत में (नियंत्रण-एम, या गाड़ी वापसी) की जांच करें। आपको उन्हें पहले निकालने की आवश्यकता होगी, फिर पंक्ति के अंत में अतिरिक्त पाठ जोड़ें।

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

0
  1. आप बैकरेक्शन तकनीक का उपयोग करके भी इसे प्राप्त कर सकते हैं

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. आप इस तरह से awk के साथ भी उपयोग कर सकते हैं

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    

-1

sed -i 's / $ /, / g' foo.txt

मैं एक आउटपुट के अंत में अल्पविराम जोड़ने के लिए अक्सर ऐसा करता हूं ताकि मैं आसानी से इसे पायथन (या आपके fav लैंग) सरणी में कॉपी और पेस्ट कर सकूं

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