代码之家  ›  专栏  ›  技术社区  ›  BBJinu

Perl未提供预期输出

  •  0
  • BBJinu  · 技术社区  · 7 年前

    我正在尝试进行模式匹配搜索,以查找任何包含employeeID:xxxxxx的数字的内容,并将所有匹配的条目带到其中。但它似乎并没有像预期的那样起作用。反之亦然,在employeeID字段中输入所有没有数字的条目。

    我的测试文件

    dn: CN=User One,OU=Disabled,OU=People,DC=training,DC=example,DC=
     com  
    userAccountControl: 514  
    employeeID: user1  
    comment: HIRED  
    sAMAccountName: user1  
    
    dn: CN=Given-iPad01,OU=Room,DC=training,DC=example,DC=com  
    userAccountControl: 544  
    employeeID: Given-iPad01  
    sAMAccountName: Given-iPad01  
    lastLogonTimestamp: 130678281934843750    
    
    dn: CN=User Two,OU=Admins,DC=training,DC=example,DC=com  
    userAccountControl: 512  
    employeeID:: IDE2NzQwODg=  
    sAMAccountName: user2  
    lastLogonTimestamp: 131685330348725308    
    
    dn: CN=Test User2,OU=2012,OU=People,DC=training,DC=example
     ,DC=com  
    userAccountControl: 512  
    employeeID: testuser2  
    sAMAccountName: testuser2  
    lastLogonTimestamp: 131328157284117480    
    
    dn: CN=User Three,OU=People,DC=training,DC=example,DC=com  
    userAccountControl: 512  
    employeeID: 123456  
    comment: HIRED  
    sAMAccountName: user3  
    lastLogonTimestamp: 131679287880585713   
    

    我的预期输出是带来除具有employeeID:testuser的实体之外的所有实体,但我的结果只带来了具有employeeID:123456的条目。
    下面是我要找的

    dn: CN=User One,OU=Disabled,OU=People,DC=training,DC=example,DC=com  
    userAccountControl: 514  
    employeeID: user1  
    comment: HIRED  
    sAMAccountName: user1    
    
    dn: CN=User Two,OU=Admins,DC=training,DC=example,DC=com  
    userAccountControl: 512  
    employeeID:: IDE2NzQwODg=  
    sAMAccountName: user2  
    lastLogonTimestamp: 131685330348725308    
    
    dn: CN=User Three,OU=People,DC=training,DC=example,DC=com  
    userAccountControl: 512  
    employeeID: 123456  
    comment: HIRED  
    sAMAccountName: user3  
    lastLogonTimestamp: 131679287880585713    
    
    dn: CN=Test User2,OU=2012,OU=People,DC=training,DC=example,DC=com  
    userAccountControl: 512  
    employeeID: testuser  
    sAMAccountName: testuser  
    lastLogonTimestamp: 131328157284117480    
    
    dn: CN=Given-iPad01,OU=Rooms,DC=training,DC=example,DC=com  
    userAccountControl: 544  
    employeeID: Given-iPad01  
    sAMAccountName: Given-iPad01  
    lastLogonTimestamp: 130678281934843750    
    

    以下是我尝试的内容: 在employeeID条目的任意位置提取包含数字的
    perl -000 -ne 'print if /employeeID: [0-9]/' testfile

    不要在employeeID条目上的任何位置提取那些包含数字 perl -000 -ne 'print if !/employeeID: [0-9]/i' testfile

    2 回复  |  直到 7 年前
        1
  •  2
  •   choroba    7 年前

    数字前面可以有除换行符以外的任何字符。 . 匹配除newline以外的任何内容, .* 表示可以有0个或更多此类字符。 /m 需要制作 ^ 匹配行的开头,而不是字符串的开头。

    perl -000 -ne 'print if /^employeeID: .*[0-9]/m' -- file
    
        2
  •  0
  •   kingsfoil Brian Joseph Spinos    7 年前

    Perl当然非常适合此任务,但可能更容易:

    grep -E -B 2 -A 3 'employeeID:\s*.*[0-9]+.*' ./testfile

    您没有看到这个一行程序的预期输出的原因是您告诉perl只匹配 [0-9] .你需要 quantify 表达式中的此 + * ),以及匹配非数字字符(例如。 .* )。

    最好是 read up 关于正则表达式的工作原理。在这里,您可以使用以下特定表达式: https://regexr.com/3o9av