我将如何删除仅包含两个点的所有行(从文本文件中(,点之间有随机数据。有些行有三个或更多点,我需要将它们保留在文件中。我想使用 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
在这里
使用会更简单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
- 这将保留类似
sed '/^[^.]*.[^.]*.[^.]*$/d' file
输出:
.please.dont.delete.me.dont.delete.me.ether.nnoooo.not.meee
请参阅: 堆栈溢出正则表达式常见问题解答
sed 用于进行替换,只需 Globally 搜索 Regular Expression 和 Print 结果,还有一个完全不同的工具专门为此目的设计,甚至以它命名 - grep
.
grep -v '^[^.]*.[^.]*.[^.]*$' file
或使用 GNU grep for ERE:
$ grep -Ev '^[^.]*(.[^.]*){2}$' file
.please.dont.delete.me
.dont.delete.me.ether
.nnoooo.not.meee
我没有方便sed
来仔细检查,但是
/^[^.]*.[^.]*.[^.]*$/d
应匹配并删除所有在它们之前和之间有两个点且非点字符串的行。
这可能对你有用(GNU sed(:
sed 's/./&/3;t;s//&/2;T;d' file
如果有 3 个或更多.
打印。如果有 2 个.
删除。否则打印。
另一种方式:
sed -r '/^([^.]*.[^.]*){2}$/d' file