我需要提取(或计算)具有两个或多个点的行(在文件中)。行不应该以点开头(如果以点结尾也可以),并且不能有两个点连续(即点都用非点字符分隔)。
输出示例:
a.b.
a.b.com
a.b.c.
a.b.c.com
但不是:
a.com
a..b
a.b.c..d
我做了这个命令:
grep -P '^[^.]+\.([^.]+\.)+[.]+' file.txt | wc -l
但它没有找到任何匹配的行。我该怎么做?
我需要提取(或计算)具有两个或多个点的行(在文件中)。行不应该以点开头(如果以点结尾也可以),并且不能有两个点连续(即点都用非点字符分隔)。
输出示例:
a.b.
a.b.com
a.b.c.
a.b.c.com
但不是:
a.com
a..b
a.b.c..d
我做了这个命令:
grep -P '^[^.]+\.([^.]+\.)+[.]+' file.txt | wc -l
但它没有找到任何匹配的行。我该怎么做?
\.
并且[.]
是等价的——它们都匹配一个文字点,而不是任何其他字符。作为风格问题,选择一个并始终如一地使用它。([^.]+\.)+
后跟[.]+
. 这实际上(有点)等同于[^.]+\.
,[.]
结果是您的 grep 正在寻找包含 的行 ,即连续两个点。如果你检查,你会看到你的命令匹配。text.text..
a.b..
[.]
为[^.]
(也许这就是您最初的意思?),将以下内容更改+
为 an*
,然后添加 a$
。在一定数量的组之后,要求/允许除点之外的任何数量(零个或多个)字符,直到行尾。text.
grep
查找以非点字符开头并包含至少两个点的行。第二个grep
删除具有两个连续点的线。grep … | wc -l
与其做,不如做grep -c …
。使用
awk
:这里的
awk
程序使用点作为字段分隔符。具有两个或更多点的线与具有多于两个场的线相同。这就是NF > 2
测试测试的内容。第一个正则表达式丢弃以点开头的行,第二个正则表达式丢弃连续包含两个或多个点的行。其余的行被打印。同样的事情
grep
:第一个表达式提取至少包含两个点的行,另外两个删除以点开头或包含两个连续点的行。
或与
sed
,您可以使用环视来做到这一点,如下所示:
读作:
^
(?!\.)
(?!.*\.\..*)
(?=.*\..*\.)