正则表达式字符出现恰好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循环是什么东西太长了
感谢您的时间,并与我分享您的知识。
你绝对可以做得更快。
这里是一个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
好的,非常感谢,它可以工作,它的速度比我的要快得多。使用小样本文件使我认为它运行良好,但是当处理65536(2^16)个条目时,它显示事情有多慢,我自己解决了第一部分,但是这个让我想了一会儿! – JFs743
如何KISS? 'grep -E'0011 | 0101 | 0110 | 1001 | 1010 | 1100'' – janos