【问题标题】:Perl not giving expected outputPerl 没有给出预期的输出
【发布时间】:2018-04-20 16:36:16
【问题描述】:

我正在尝试对具有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

【问题讨论】:

  • 这只会查找以数字开头的员工编号。添加+[0-9]+\d+ 和一个单词边界标记:\d+\b 或换行符\d+\n
  • 看起来您正在粘贴真实的员工数据。如果我是你,我会编辑它。我知道这是从哪里来的,但通常不赞成在互联网上发布这样的真实数据。
  • @Robert 你是这个意思吗? perl -000 -ne '打印 if /employeeID+: [0-9]+/i' 测试文件
  • @0112 这不是真实数据,我的实验室,甚至我在粘贴之前都修改了整个数据。谢谢
  • 你说你正在寻找的结果有'testuser'并且看起来和你的输入一样?

标签: perl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Perl 确实非常适合这项任务,但它可能更容易:

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

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

    最好read up 了解正则表达式的工作原理。这是一个您可以玩弄这个特定表达式的环境:https://regexr.com/3o9av

    【讨论】:

    • 如果我理解正确,您需要一个匹配文件中员工 ID 为数字的所有条目的正则表达式。我误解了吗?这种表达方式非常适合我。
    • @Binish 我注意到在您的预期输出中,您现在列出了几个员工 ID 为非数字的条目。在您的问题中,您声明您 “尝试对任何具有employeeID: xxxxxx 编号的内容进行模式匹配搜索,并带来所有匹配的条目。” 我认为您可能需要进一步澄清在我们为您提供帮助之前。
    • 您的正则表达式只匹配一个条目的原因是因为只有一个条目的employeeID 是数字。 (在您在此处提供的数据中。
    • 是正确的更清楚,其中员工ID包含数字,例如可以是abcd1、123abc、aa11bb。但它不应该提取任何没有数字的条目,例如 testuser 或 abcd===
    • 这有点不同。请您编辑您的原始问题以澄清这一点吗?
    猜你喜欢
    • 2018-09-18
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多