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