如何删除包含多于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
答案 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
>