2017-04-15 276 views
2

如何刪除包含兩個點的所有線(來自文本文件),點之間有隨機數據。一些行有三個或更多的點,我需要這些保留在文件中。我想用sed。刪除包含兩個點的線,點之間帶有字符

例髒文件:

.dirty.dig 
.please.dont.delete.me 
.delete.me 
.dont.delete.me.ether 
.nnoooo.not.meee 
.needto.delete 

所需的輸出:

.please.dont.delete.me 
.dont.delete.me.ether 
.nnoooo.not.meee 

回答

0

我沒有sed方便的仔細檢查,但

/^[^.]*\.[^.]*\.[^.]*$/d 

應該匹配和刪除有兩個點之前和他們之間的非點的字符串的所有行。

2

將是簡單的使用awk這裏

$ awk -F. 'NF!=3' ip.txt 
.please.dont.delete.me 
.dont.delete.me.ether 
.nnoooo.not.meee 
  • -F.使用.作爲分隔符
  • NF!=3打印所有行,其中輸入字段數不等於3
    • 這將保留線如abc.xyz
    • 只保留線,超過2個點,使用awk -F. 'NF>3' ip.txt
+0

我很抱歉,我的數據,因這interfearing線的末端有一些連字符,其實這方面的成效斐然。 – derpderpalert

0

這可能爲你工作(GNU SED):

sed 's/\./&/3;t;s//&/2;T;d' file 

如果有3個或更多.打印。如果有2 .刪除。否則打印。

另一種方式:

sed -r '/^([^.]*\.[^.]*){2}$/d' file 
+0

'-r'只能在GNU sed中工作,而'-E'可以在GNU和OSX seds中工作,所以使用'-E'比使用'-r'更便於攜帶。 –

+0

當我手動運行該工具時效果很好,但是從bash腳本中,它不會工作。 – derpderpalert

+0

我很抱歉,我的數據中有一些連字符末尾的連字符,這實際上效果非常好。 – derpderpalert

0

戰略經濟對話作出換人,只是 lobally搜索[R egular Ë上的表達和P RINT結果有一個整體的其他工具,只是爲了這個目的,甚至命名它 - grep

grep -v '^[^.]*\.[^.]*\.[^.]*$' file 

或GNU grep命令ERES:

$ grep -Ev '^[^.]*(\.[^.]*){2}$' file 
.please.dont.delete.me 
.dont.delete.me.ether 
.nnoooo.not.meee 
+0

再一次,工作很好,直到你嘗試從bash腳本運行它,然後它不會工作。 – derpderpalert

+1

我很抱歉,我的數據在行間的末尾有一些連字符,這實際上效果非常好。 – derpderpalert