使用 <propertyregex>ant ,如何为用户捕获 /etc/shadow 记录?



从ant中,我们希望从旧的/etc/shadow文件中提取一行,捕获特定用户名的行,例如"manager"。这是备份/恢复操作的一部分。我们以前使用的内容不够具体,所以它会与"mymanager"等用户相匹配,所以我们试图通过将字符串的开头锚定到行的开头(通常为"^")来收紧它这肯定没有像我们预期的那样奏效

我们如何锚定以便获得用户名的精确匹配?--回答如下

第一次尝试,如果/etc/shadow文件副本中有"mymanager"的用户,则会给出错误的结果:

<loadfile property="oldPasswords" srcFile="${backup.dir}/shadow"/>
<propertyregex property="manager.backup" input="${oldPasswords}"
    regexp="(manager:.*)" select="1" casesensitive="true" />

第二次尝试失败,因为默认情况下"^"不是以正常的正则表达式方式解释的:

<loadfile property="oldPasswords" srcFile="${backup.dir}/shadow"/>
<propertyregex property="manager.backup" input="${oldPasswords}"
    regexp="^(manager:.*)" select="1" casesensitive="true" />

Kobi建议添加->flags="m"<-这听起来不错,但ant报告称propertygex不支持flags选项。

最后一个成功的方法需要在regexp的开头插入"(?m)":这是一个重要的更改。

<propertyregex property="manager.backup" input="${oldPasswords}"
    regexp="(?m)^manager:.*$" select="" casesensitive="true" />

带有propertyregex的regexp似乎遵循Java中正则表达式文档中的规则(例如搜索"multiline"):http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

如果您对如何使propertyregexregexp执行您希望它们执行的操作有类似的问题,请查看上面的文档

谢谢!已解决。

Alan Carwile

我认为m(ultiline)标志是您想要使用的,它将为线锚的开始提供正确的行为。可以使用语法(?<flagstoturnon>-<flagstoturnoff>)更改正则表达式中的标志。因此,在您的情况下,将(?m)添加到正则表达式的开头(插入符号之前)应该可以。

相关内容

  • 没有找到相关文章

最新更新