删除没有n个特定字符的行?

时间:2013-12-12 22:17:57

标签: regex bash shell

我有一个文件,其中有许多行由#:分隔,我想删除所有没有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这样的所有行。一些

3 个答案:

答案 0 :(得分:3)

这个传递给grep的扩展正则表达式应该这样做:

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

This debugging tool is really handy when debugging regular expressions.

Debuggex Demo of this regular expression

答案 1 :(得分:2)

awk 'split($0, a, "#") == 4 || split($0, a, ":") == 5' file.txt

答案 2 :(得分:0)

使用grep的{​​{1}}(简称--invert-match):

-v