2017-09-15 147 views
5

我想在sed中刪除一個模式,僅在第二次發生時刪除。這是我想要的,刪除一個模式,但第二次出現。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 

輸出想要的東西:

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 's/(\(null)\).*csv//' file.csv 

這裏的問題是,正則表達式是太貪婪,但我不能停下來。 我也試過這樣,跳過「空」中第一次出現:

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

也試過,但貪婪的正則表達式仍是問題。

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

我讀過?可以使正則表達式「懶」,但我不能讓它鍛鍊。

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

如果你可能有3個或更多'(null)'s,並且你只想刪除第二個事件,那麼I t哼,使用'。*?'而不是'。*'來處理perl會更容易。 –

回答

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

偉大的這是工作得很好!我將不得不更多地瞭解awk工具! – BeGreen

4

sed確實提供一種簡單的方法來指定要替換哪一個匹配。只需添加分隔符後的數字

$ 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 

而且,不使用擴展正則表達式

+0

我試過了,如果你在我的文章中看得更近。問題是貪婪的正則表達式。我必須用'[^,] *'來改變'。*',就像你的例子。謝謝。 – BeGreen

+1

嗯,我沒有注意到你已經嘗試過'// 1'(稍後編輯爲'// 2')...所以你只能被貪婪的問題推遲......在這種情況下容易解決,因爲有使用'[^,]'或'[^。]解決方法'...對於通用情況,您可能需要在perl/python/etc中提供正確的csv解析器 – Sundeep

+1

您是對的,我可以用pyexcel完成此操作,我的腳本。沒想過! – BeGreen

-1

時不需要轉義()執行:

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