首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个grep命令有什么问题?

这个grep命令有什么问题?
EN

Stack Overflow用户
提问于 2016-10-01 02:22:35
回答 2查看 120关注 0票数 1

好吧..。因此,我试图用Crunch和Grep制作一个字典,我也尝试使用Perl。

代码语言:javascript
运行
复制
crunch 8 12 1234567890 -d 2@ | grep -v '\([0-9]\) .*\1.*\1.*\1.*' | grep 41106041

所以,基本上,我想过滤所有密码,其中数字出现3次。

代码语言:javascript
运行
复制
grep 41106041 

只是测试代码是否有效..。但事实并非如此。

我还尝试了一些"C样式“perl代码,因为我仍然是perl的新手:

代码语言:javascript
运行
复制
#! /bin/perl
@lines=<STDIN>;
$c=0;
foreach $number(@lines)
{
    $acum=undef;
    $pos=0;
    while($pos <= &countdig($number))
    {
        if ($acum=$digit)
        {
            $c=$c+1;
        }
        else
        {
            $c=0;
        }
        $acum=$digit;

    }
    if ($c=3)
    {
        print "$number"." ";
    }
    $c=0;
}

sub countdig
{
    my($j)=0;
    chomp(my(@n)=@_);
    print "first dig $n[$j] \n";
    while($_[0][$j]>=0 && $_[0][j]<=9)
    {
        $j+=1;

    }
    print "j total : $j  \n";

    $j;
}

伯爵被认为是数位数,但事情是..。我不能以列表的形式访问标量变量。所以,如果你们能解释我如何使它工作,这将是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-01 04:32:02

您的grep失败了,因为您的模式中有一个空闲空间,您正在搜索4个相同的数字(其中一个是捕获的,再加上三个是通过反向引用获得的)。

代码语言:javascript
运行
复制
$ printf '12345678\n41106041\n87654321\n' | grep -v '\(.\).*\1.*\1'
12345678
87654321

问题不是成为Perl的新手,因为C解决方案很容易实现。

代码语言:javascript
运行
复制
// For each line

char *num = ...;

int digits[10];
for (int i=0; i<10; ++i) {
   digits[i] = 0;
}

const char *p = num;
int triple = 0;
for (; *p && *p != '\n'; ++p) {
   if (++digits[*p - '0'] == 3) {
      triple = 1;
      break;
   }
}

if (triple) {
   ...
}

转换为Perl解决方案

代码语言:javascript
运行
复制
while (my $num = <>) {
   chomp($num);

   my @digits;
   my $triple;
   for my $digit (split //, $num) {
      if (++$digits[$digit] == 3) {
         $triple = 1;
         last;
      }
   }

   say $num if $triple;
}

当然,Perl程序员很可能使用与grep相同的方法。

代码语言:javascript
运行
复制
while (<>) {
   if (!/(.).*\1.*\1/) {
      print;
   }
}
票数 3
EN

Stack Overflow用户

发布于 2016-10-01 04:27:41

代码语言:javascript
运行
复制
echo 41106041 | grep -v '\([0-9]\).*\1.*\1.*
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39802403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档