किसी पाठ फ़ाइल की प्रत्येक पंक्ति में स्ट्रिंग की nth घटना को प्रतिस्थापित करें


15

मेरे पास अंतरिक्ष सीमांकित तारों (2-5) के साथ बड़ी पाठ फाइलें हैं। स्ट्रिंग्स में "" या "-" हो सकता है। मैं एक पाइप के साथ दूसरी जगह कहना चाहता हूं।

सबसे अच्छा तरीका क्या है?

Sed का उपयोग करते हुए मैं इस बारे में सोच रहा था:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

कोई अन्य / बेहतर / सरल विचार?

जवाबों:


22

आप स्थानापन्न कमांड के अंत में एक संख्या जोड़ सकते हैं। उदाहरण के लिए, निम्नलिखित प्रत्येक पंक्ति में oldस्ट्रिंग के साथ दूसरी घटना को प्रतिस्थापित करेगा :newfile

sed 's/old/new/2' file

इसलिए, अपने प्रस्तावित समाधान के बजाय, आप उपयोग कर सकते हैं:

sed 's/ /|/2'

अधिक जानकारी के लिए, इस sed ट्यूटोरियल को देखें


2
से sedजानकारी फ़ाइल: "ध्यान दें: POSIX मानक निर्दिष्ट नहीं करता है जब आप मिश्रण क्या होने चाहिए g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across sed '। कार्यान्वयन के लिए जीएनयू` sed', बातचीत होने के लिए परिभाषित किया गया है: NUMBERth से पहले मैचों पर ध्यान न दें, और उसके बाद से मेल खाते हैं और सभी की जगह पर से मिलान
अगली सूचना तक रोक दिया गया।

जानकारी फ़ाइलें ... मुझे उनसे नफरत है। वैसे भी, मैंने अस्पष्ट भाग को हटा दिया। अच्छी टिप्पणी, +1।
mrucci

1
धन्यवाद, mrucci और डेनिस। मैंने सोचा कि वहाँ कुछ सरल होना चाहिए।
dnkb

यह हर समस्या है जो मुझे पाठ हेरफेर के साथ है, मैं इसके साथ हल करने का प्रबंधन करता हूं sed। मुझे यकीन नहीं है कि मुझे मेरे लिए और sedअधिक उपयोगी बनाने के लिए आपको धन्यवाद देना चाहिए , लेकिन मैं वैसे भी करूंगा। ;)
जेमी

1

क्या आपने अपना संस्करण आज़माया? काम किया? क्योंकि मुझे लगता है कि यह मूल रूप से एक अच्छा विचार है। मैं थोड़ा अलग तरीके से करूंगा, हालांकि:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

यह किसी भी वर्ण को ऐसे शब्द में स्वीकार करेगा जो स्थान नहीं है, और पहले दो शब्दों के बीच एक से अधिक स्थान स्वीकार करेगा।

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