Regex 是否删除不包含n个特定字符的行?

Regex 是否删除不包含n个特定字符的行?,regex,bash,shell,awk,grep,Regex,Bash,Shell,Awk,Grep,我有一个文件,其中有许多行由或:分隔,我想删除所有没有3磅4个冒号的行。这就是我所尝试的: awk '! /^\#{3}\:{4}+$/' "$file" 编辑以提供采样线: 958#40#6#020104 Thanhachammet,Chendrit:D500:5833:8.40:12.10 This is # bad : line 我不想把像1和2这样的所有行都发送到一个文件中,不包括像#3这样的所有行。一些使用grep的--inverse match(-v): 此传递给grep的扩展r

我有一个文件,其中有许多行由
分隔,我想删除所有没有3磅4个冒号的行。这就是我所尝试的:

awk '! /^\#{3}\:{4}+$/' "$file"
编辑以提供采样线:

958#40#6#020104
Thanhachammet,Chendrit:D500:5833:8.40:12.10
This is # bad : line

我不想把像1和2这样的所有行都发送到一个文件中,不包括像#3这样的所有行。一些使用
grep
--inverse match
-v
):


此传递给grep的扩展regexp应执行以下操作:

grep -E '(#.*#.*#|:.*:.*:.*:)' file.txt
在Ubuntu 12.04上:

$ cat file.txt 
958#40#6#020104
Thanhachammet,Chendrit:D500:5833:8.40:12.10
This is # bad : line
$ grep -E '(#.*#.*#|:.*:.*:.*:)' file.txt 
958#40#6#020104
Thanhachammet,Chendrit:D500:5833:8.40:12.10
$
如果需要匹配3或4个以上的
,则可以执行以下操作:

grep -E '((#.*){2}#|(:.*){3}:)' file.txt
awk '/(#.*#.*#|:.*:.*:.*:)/' file.txt
如果愿意,您可以这样做:

grep -E '((#.*){2}#|(:.*){3}:)' file.txt
awk '/(#.*#.*#|:.*:.*:.*:)/' file.txt

带有


您的正则表达式正在查找只有####后跟4个或更多冒号的行(即,没有其他字符)。这可能是问题的一部分吗?你的意思是连续3秒还是4秒
?最好举个例子这对我不管用。它假定3个
或4个
是连续的,这在OP的输入数据中是不正确的。最好使用:
$grep-E'(#[^.\]*.[^.]*.[^::][^:][^:][^:][^::][^:][^:][*]“file.txt,这会更有效,因为它会减少很多回溯。这将允许超过指定的次数,尽管如此。您仍然需要锚点,以及每个组中最后一个否定表达式的尾随重复星。@tripleee-Oops-是的,您是对的-我复制了错误的命令。如果您正好需要3个
或4个
,那么这就足够了:
grep-E'^([^.]*.}{3}[^.]*.*.[^::::*){4}[^:]$'file.txt