正则表达式字符出现恰好x次

问题描述:

我在bash工作,我有,我想删除所有不符合特定正则表达式,该行大文件可能使用$ grep -e "<regex>" <file> > output.txt正则表达式字符出现恰好x次

我想保留什么是包含正好X倍指定字符,例如在二进制序列

0000,0001,0010,0011,0100,0101,0111,1000,1001,1010,1011,1100的任何行, 1101,1110,1111

我想只保留那些谁拥有2 ,留下我与

0011,0101,0110,1001,1010,1100

然后,我会用一个bash变量改变 我litterally寻找是半线(与相同长度的字符串工作总是精确长度的一半,)我需要的量半

我现在有这个权利。它不使用正则表达式。它的工作原理,但速度很慢:

$1是每一个字符串的长度,$d只是一个目录)

sed -e 's/\(.\)/\1 /g' < $d/input.txt > $d/spaces.txt 
awk '{c=0;for(i=1;i<=NF;++i){c+=$i};print c}' $d/spaces.txt > $d/sums.txt 
grep -n "$(($1/2))" $d/sums.txt | cut -f1 -d: > $d/linenums.txt 
for i in $(cat $d/linenums.txt) 
do 
    sed "${i}q;d" $d/input.txt 
done > $d/valids.txt 

如果你想知道这使空间中每个数字转向1010之间为1 0 1 0,然后将这些值相加,将结果保存在sums.txt中,将grep保存为length/2,并仅将行号保存在linenums.txt中,然后读取linenums.txt并将相应的行从input.txt输出到output.txt

我需要更快一点的for循环是什么东西太长了

感谢您的时间,并与我分享您的知识。

+0

如何KISS? 'grep -E'0011 | 0101 | 0110 | 1001 | 1010 | 1100'' – janos

你绝对可以做得更快。

这里是一个grep正则表达式的例子,以配合准确的两次出现1任何行:

grep '^\([^1]*1[^1]*\)\{2\}$' input.txt 

可以概括这正好相匹配n出现c

grep "^\([^$c]*$c[^$c]*\)\{$n\}\$" input.txt 

你也提到想匹配一半为0 s,一半为1 s的行。你既然规定,所有的线的长度是相同的,你可以考虑只在第一行,并使用awk(或wc),以获得线的长度和选择n

n=`head -n1 input.txt | awk '{printf "%d\n",length($0)/2}'` 
c=1 
grep "^\([^$c]*$c[^$c]*\)\{$n\}\$" input.txt 
+1

好的,非常感谢,它可以工作,它的速度比我的要快得多。使用小样本文件使我认为它运行良好,但是当处理65536(2^16)个条目时,它显示事情有多慢,我自己解决了第一部分,但是这个让我想了一会儿! – JFs743