2017-04-15 273 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