sed: पहले वाले को छोड़कर एक स्ट्रिंग की सभी घटनाओं को हटा दें


14

मेरे पास इसमें टाइमस्टैम्प के साथ एक लॉगफ़ाइल है। कभी-कभी एक पंक्ति में कई टाइमस्टैम्प होते हैं। अब मैं टाइमस्टैम्प के सभी को एक पंक्ति से हटाना चाहूंगा, लेकिन पहले वाले को रखूंगा।

मैं कर सकता हूं s/pattern//2लेकिन यह केवल दूसरी घटना को हटाता है और sedऐसा कुछ करने की अनुमति नहीं देता है s/pattern//2-

कोई सुझाव?


मुझे बताया जाना चाहिए कि यह बिजीबॉक्स का सेड है। उसके लिए खेद है।
लोकगीत वैन हेस्डेन

जवाबों:


4

GNU के साथ sed:

sed 's/pattern//2g'

2निर्दिष्ट करता है कि दूसरी पैटर्न और सभी बाकी gनिकाल देना चाहिए। तो यह पहले वाले को बनाए रखेगा।


1
साइगविन के पास (जाहिरा तौर पर) का पोर्ट है और मैकओएस नहीं है। Achh! यह समाधान इतना अधिक सुरुचिपूर्ण है।
r_alex_hall

7

यह काम करना चाहिए (कुछ और द्वारा _ इसे आपके लॉग से टकरा जाना चाहिए):

sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'

1
यदि आप कभी भी एक अद्वितीय सीमांकक चाहते हैं, तो उपयोग करें \n
मोकेसर

5
sed -e ':begin;s/pattern//2;t begin'

या बिना सिडो गोटो:

sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//;s/pattern//g;H;g;s/\n.*\n//'

Nth (3 उदाहरण के लिए) स्थिति से निकालने के लिए सामान्य समाधान हैं:

sed -e ':begin;s/pattern//4;t begin'
sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//3;s/pattern//g;H;g;s/\n.*\n//'

1

@ जिलग्रे के उत्तर पर थोड़ी भिन्नता (मजबूती के लिए संशोधित) जैसी दिख सकती है:

sed 's/p\(attern\)/p\n\1/;s///g;s/\n//'

... लेकिन कुछ sedएस में आपको शाब्दिक रूप रेखा चरित्र के साथ nपहले s///ubstocation बयान के दाईं ओर की जगह की आवश्यकता हो सकती है \n

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