Sed 删除包含两个点且点与点之间有字符的行

Sed 删除包含两个点且点与点之间有字符的行,sed,Sed,我如何删除所有只包含两个点的行(从文本文件中),点之间有随机数据。有些行有三个或更多的点,我需要它们保留在文件中。我想用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 输出: .pleas

我如何删除所有只包含两个点的行(从文本文件中),点之间有随机数据。有些行有三个或更多的点,我需要它们保留在文件中。我想用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
输出:

.please.dont.delete.me .dont.delete.me.ether .nnoooo.not.meee 请不要删除我 .Don.delete.me.ether .nnooo.not.meee

请参阅:

我没有一个可以反复检查的
sed
,但是

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

应该匹配并删除所有在它们之前和之间有两个非点字符串的点的行。

在这里使用
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
这可能适合您(GNU-sed):

如果有3个或更多
打印。如果有2个
删除。否则打印

另一种方式:

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

sed是用来进行替换的,只需G全局搜索RegularExpression和print,结果就是有一个完整的其他工具专门为此设计,甚至以它命名-
grep

grep -v '^[^.]*\.[^.]*\.[^.]*$' file
或使用GNU grep进行ERE:

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

-r
只能在GNU-sed中使用,而
-E
可以在GNU和OSX sed中使用,因此使用
-E
比使用
-r
更便于携带。当我手动运行时效果很好,但是从bash脚本来看,它不起作用。很抱歉,我的数据在行尾有一些连字符,这些字符相互干扰,这实际上工作得非常好。我很抱歉,我的数据在行尾有一些连字符,它们相互干扰,这实际上工作得非常好。我很抱歉,我的数据在行尾有一些连字符,它们相互干扰,这实际上工作得非常好。
grep -v '^[^.]*\.[^.]*\.[^.]*$' file
$ grep -Ev '^[^.]*(\.[^.]*){2}$' file
.please.dont.delete.me
.dont.delete.me.ether
.nnoooo.not.meee