2014-11-25 50 views
1

我正在查找SED(首選)或其他可以處理正則表達式的實用程序的模式,以從file.txt中刪除不必要的-,字符。用於刪除其中包含一些逗號的'減號'字符的模式

我想刪除一切看起來是這樣的:

-----------,-------------------------------------,---------,-,---------,--------- 

而不刪除不屬於近負任何逗號,沒有如果他們後面的數字或字母消除任何短處。

我在尋找的模式是-,,---(我是這麼認爲的)

科馬斯和未匹配模式優缺點,應保持不變;)

輸入的樣子此:

xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxx,xxxx 
------------------,------------------,---------------------------------------------------------------------------- 
-----------------------------------------------------,-,---,---------------------------,-----------------,--------- 
1999,2014,591025,xöxxxxxxx,~,~,xxxxöxxx,xxx,1103469,27-xxx-76,x,01-xxx-99,31-xxx-01,,273,321,321,2 
1999,2014,591025,xöxxxxxxx,~,~,xxxx,xxxxx,1103759,13-xxx-61,x,01-xxx-99,30-xxx-01,,~,321,321,1 
1999,2014,591025,xöxxxxxxx,~,~,xxxxxxx,xxxx,1109909,01-xxx-70,x,01-xxx-99,31-xxx-00,,~,321,321,1 

所需的輸出:

xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxx,xxxx 
1999,2014,591025,xöxxxxxxx,~,~,xxxxöxxx,xxx,1103469,27-xxx-76,x,01-xxx-99,31-xxx-01,,273,321,321,2 
1999,2014,591025,xöxxxxxxx,~,~,xxxx,xxxxx,1103759,13-xxx-61,x,01-xxx-99,30-xxx-01,,~,321,321,1 
1999,2014,591025,xöxxxxxxx,~,~,xxxxxxx,xxxx,1109909,01-xxx-70,x,01-xxx-99,31-xxx-00,,~,321,321,1 
+0

@fedorqui工作sed的 - 一切在文件中(這是一個CSV數據文件)應該保持不變。我只需要刪除不必要的-----,----, - 字符。他們進入一種模式 - 至少有兩個缺點,一個是負號,接着是昏迷,另一個是負號,接着是負號。 – dziki 2014-11-25 09:51:21

+0

@dziki舉一個例子。 – 2014-11-25 09:52:30

+1

@fedorqui - 我已經用輸入和期望的輸出更新了這個問題。 – dziki 2014-11-25 10:02:05

回答

0

你可以使用這個sed的:

sed -i.bak -r '/(-+,)+-+$/d' input 
xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxx,xxxx 
1999,2014,591025,xöxxxxxxx,~,~,xxxxöxxx,xxx,1103469,27-xxx-76,x,01-xxx-99,31-xxx-01,,273,321,321,2 
1999,2014,591025,xöxxxxxxx,~,~,xxxx,xxxxx,1103759,13-xxx-61,x,01-xxx-99,30-xxx-01,,~,321,321,1 
1999,2014,591025,xöxxxxxxx,~,~,xxxxxxx,xxxx,1109909,01-xxx-70,x,01-xxx-99,31-xxx-00,,~,321,321,1 

您可以使用此AWK:

awk -F '(-+,)+-+$' '$NF' input 
xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxx,xxxx 
1999,2014,591025,xöxxxxxxx,~,~,xxxxöxxx,xxx,1103469,27-xxx-76,x,01-xxx-99,31-xxx-01,,273,321,321,2 
1999,2014,591025,xöxxxxxxx,~,~,xxxx,xxxxx,1103759,13-xxx-61,x,01-xxx-99,30-xxx-01,,~,321,321,1 
1999,2014,591025,xöxxxxxxx,~,~,xxxxxxx,xxxx,1109909,01-xxx-70,x,01-xxx-99,31-xxx-00,,~,321,321,1 

甚至這個awk的工作原理:

awk -F '(-+,)+-+$' 'NF==1' input 
+1

最後一個工作像一個魅力,甚至沒有看到你發佈了另外兩個:)謝謝,完美的工作! – dziki 2014-11-25 10:12:17

+0

@dziki:不客氣,其他2個命令也可以工作,以防萬一你想嘗試它們:) – anubhava 2014-11-25 10:13:26

0

如何

$ sed 's/--\+\|-,\+\|,-//g; /^$/d' input 
xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxx,xxxx 
1999,2014,591025,xöxxxxxxx,~,~,xxxxöxxx,xxx,1103469,27-xxx-76,x,01-xxx-99,31-xxx-01,,273,321,321,2 
1999,2014,591025,xöxxxxxxx,~,~,xxxx,xxxxx,1103759,13-xxx-61,x,01-xxx-99,30-xxx-01,,~,321,321,1 
1999,2014,591025,xöxxxxxxx,~,~,xxxxxxx,xxxx,1109909,01-xxx-70,x,01-xxx-99,31-xxx-00,,~,321,321,1 

或者一個很好的外觀NG使用-r選項

$ sed -r 's/--+|-,+|,-//g; /^$/d' input 
0

另一個SED選項

sed '/^[-,]\+$/d' file 

另一個AWK

awk '!/^[-,]+$/' file 

這些會爲你的輸出

相關問題