2017-09-15 23 views
5

मैं केवल दूसरे अवसर पर, sed के साथ एक पैटर्न को हटाना चाहता हूं। यहां मैं जो चाहता हूं, एक पैटर्न हटाएं लेकिन दूसरी घटना पर।सेड दूसरे मौके पर प्रतिस्थापित

क्या file.csv में बताया गया है:

a,Name(null)abc.csv,c,d,Name(null)abc.csv,f 
a,Name(null)acb.csv,c,d,Name(null)acb.csv,f 
a,Name(null)cba.csv,c,d,Name(null)cba.csv,f 

आउटपुट चाहता था:

sed -r 's/(\(null)\).*csv//' file.csv 

समस्या यहां है कि regex भी है:

a,Name(null)abc.csv,c,d,Name,f 
a,Name(null)acb.csv,c,d,Name,f 
a,Name(null)cba.csv,c,d,Name,f 

यह मैं क्या करने की कोशिश की है लालची, लेकिन मैं नहीं रोक सकता है। मैं भी इस की कोशिश की, "अशक्त" की पहली आवृत्ति को छोड़ने के लिए:

sed -r '0,/null/! s/(\(null)\).*csv//' file.csv 

भी कोशिश की, लेकिन लालची regex अभी भी समस्या है।

sed -r 's/(\(null)\).*csv//2' file.csv 

मुझे लगता है कि ? "सुस्त" regex कर सकते हैं, लेकिन मैं इसे कसरत नहीं कर सकते हैं पढ़ा है।

sed -r 's/(\(null)\).*?csv//' file.csv 
+0

यदि आपके पास 3 या अधिक '(शून्य) हो और आप अभी भी दूसरी घटना को हटाना चाहते हैं, तो मैं '* * 'के बजाय'। *? 'का उपयोग करके, पर्ल के साथ करना आसान होगा। –

उत्तर

1

और अधिक मजबूत awk समाधान:

विस्तारित नमूना फ़ाइल input.csv:

12,Name(null)randomstuff.csv,2,3,Name(null)randomstuff.csv, false,Name(null)randomstuff.csv 
12,Name(null)AotherRandomStuff.csv,2,3,Name(null)AotherRandomStuff.csv, false,Name(null)randomstuff.csv 
12,Name(null)alphaNumRandom.csv,2,3,Name(null)alphaNumRandom.csv, false,Name(null)randomstuff.csv 

काम:

awk -F, '{ c=0; for(i=1;i<=NF;i++) if($i~/\(null\)/ && c++==1) sub(/\(null\).*/,"",$i) }1' OFS=',' input.csv 

उत्पादन:

12,Name(null)randomstuff.csv,2,3,Name, false,Name(null)randomstuff.csv 
12,Name(null)AotherRandomStuff.csv,2,3,Name, false,Name(null)randomstuff.csv 
12,Name(null)alphaNumRandom.csv,2,3,Name, false,Name(null)randomstuff.csv 
+0

बढ़िया यह ठीक काम कर रहा है! मुझे अजीब उपकरण पर और अधिक जांच करनी होगी! – BeGreen

4

sed जो मैच को बदला जाएगा निर्दिष्ट करने के लिए एक आसान तरीका प्रदान करता है। बस जब विस्तारित नियमित अभिव्यक्ति

+0

यदि आपने मेरी पोस्ट में नज़दीक देखा तो मैंने कोशिश की है। समस्या लालची Regex था। मुझे आपके उदाहरण में '[^,] *' के साथ '। *' बदलना पड़ा। धन्यवाद। – BeGreen

+1

अच्छी तरह से मैंने यह नहीं देखा कि आपने '// 1' (बाद में '// 2' में संपादित किया) की कोशिश की थी ... इसलिए आपको केवल लालची मुद्दे से हटा दिया गया था ... इस मामले में हल करने में आसान है जेनेरिक मामले के लिए '[^,]' या '[^।]' के साथ कामकाज आपको पर्ल/पायथन/आदि में उपलब्ध उचित सीएसवी पार्सर्स की आवश्यकता हो सकती है – Sundeep

+1

आप सही हैं, मैं इसे पाइक्ससेल के साथ कर सकता हूं जिसका मैं उपयोग करता हूं मेरी लिपि उस बारे में सोचा नहीं था! – BeGreen

-1

का उपयोग नहीं कर

$ sed 's/(null)[^.]*\.csv//2' ip.csv 
a,Name(null)abc.csv,c,d,Name,f 
a,Name(null)acb.csv,c,d,Name,f 
a,Name(null)cba.csv,c,d,Name,f 

$ # or [^,] if there are no , within fields 
$ sed 's/(null)[^,]*//2' ip.csv 
a,Name(null)abc.csv,c,d,Name,f 
a,Name(null)acb.csv,c,d,Name,f 
a,Name(null)cba.csv,c,d,Name,f 

इसके अलावा, () से बचने के लिए कोई जरूरत नहीं सीमांकक के बाद नंबर जोड़ने निष्पादित करें:

awk '{sub(/.null.....csv,f/,",f")}1' file 

और उत्पादन किया जाना चाहिए:

a,Name(null)abc.csv,c,d,Name,f 
a,Name(null)acb.csv,c,d,Name,f 
a,Name(null)cba.csv,c,d,Name,f 
संबंधित मुद्दे