Perl没有给出预期的输出

时间:2018-04-20 16:36:16

标签: perl

我正在尝试进行模式匹配搜索,以查找具有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   

我的预期输出是带来所有entires,除了有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 个答案:

答案 0 :(得分:2)

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

perl -000 -ne 'print if /^employeeID: .*[0-9]/m' -- file

答案 1 :(得分:0)

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

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

你没有看到这一个班轮的预期输出的原因是你告诉perl只匹配[0-9]的东西。您需要在表达式中使用quantify +*),并匹配非数字字符(例如.*)。

read up关于正则表达式如何工作会很好。这是一个可以使用这个特定表达式的环境:https://regexr.com/3o9av