使用正则表达式使用grep删除点数

时间:2018-10-16 15:05:05

标签: linux bash

如何删除包含多于5个“”的行。或少于5点(简而言之:每行5点? 如何编写使用grep在bash中检测到的正则表达式?

输入:

yGEtfWYBCBKtvxTbHxMK,126.221.42.321.0.147.30,10,Bad stuff is happening,http://mystuff.com/file.json
yGEtfWYBCBKtvxTbHxwK,126.221.42.21,10,Bad stuff is happening,http://mystuff.com/file.json

期望的输出:

yGEtfWYBCBKtvxTbHxwK,176.221.42.21,10,Bad stuff is happening,http://mystuff.com/file.json

尝试:

grep -P '[.]{5}' stuff.txt
grep -P '[\.]{5}' stuff.txt
grep -P '([\.]{5})' stuff.txt
grep -P '\.{5}' stuff.txt
grep -E '([\.]{5}' stuff.txt

3 个答案:

答案 0 :(得分:2)

您只能显示正好包含5个点的线,如下所示:

grep '^[^.]*\.[^.]*\.[^.]*\.[^.]*\.[^.]*\.[^.]*$' stuff.txt

或者如果您想将其分解:

grep -E '^([^.]*\.){5}[^.]*$' stuff.txt

在第二个示例中使用-E RE有助于避免不得不逃脱\(\)\{\},在第一个示例中,grep的默认BRE正则表达式是足够。

^$分别是表示行的开始和结束的锚点,以确保我们匹配整行,而不仅仅是匹配包含5个点的一部分。

[^.]是一个否定的字符类,将匹配点以外的任何字符。
它们用*进行了量化,以便每个点之间可以出现任意数量的非点字符(如果不应该匹配连续的点,您可能希望将其更改为+)。

\.匹配文字点(而不是字符类别之外的元字符.会匹配的任何字符)。

答案 1 :(得分:0)

要专门检测错误的IP地址

您是否可以确定IP地址始终被逗号包围并且不包含空格-即永远不是第一个字段还是最后一个字段?

然后,您可能会逃脱:

grep -E ',\w+((\.\w+){2,3}|(\.\w+){5,}),'

如果没有,则很难区分带空格的IP格式和普通句子,因此您可能必须指定该列。

答案 2 :(得分:-1)

仅在数字为“。”时使用Perl单线打印。超过5

> cat five_dots.txt
yGEtfWYBCBKtvxTbHxMK,126.221.42.321.0.147.30,10,Bad stuff is happening,http://mystuff.com/file.json
yGEtfWYBCBKtvxTbHxwK,126.221.42.21,10,Bad stuff is happening,http://mystuff.com/file.json
> perl -ne '{ while(/\./g){$count++} print if $count > 5; $count=0 } ' five_dots.txt
yGEtfWYBCBKtvxTbHxMK,126.221.42.321.0.147.30,10,Bad stuff is happening,http://mystuff.com/file.json
>