bash
  • shell
  • 2016-03-27 78 views 1 likes 
    1

    我属性文件grep的精确匹配不工作

    myprop2=this is with <br/> 
    

    当我想为什么发现myprop2到grep为<br>

    grep "^myprop.*=.`*<br>*`" MyProject.properties | xargs | cut -d '=' -f 1 
    

    注:我发现的<br>代替<br/>(没有结束标记)

    回答

    2

    右角支架使得*后0次以上,从而安全地在比赛中被忽略。我想你的意思是...>.*

    此外,使用前瞻就可以消除一些管道

    grep -oP "myprop.(?==.*<br>.*)" file 
    

    将给予同样没有xargs的切

    +0

    太棒了! ..多谢... –

    +0

    'grep'解决方案很有帮助,但你应该提到它需要_GNU_' grep'。虽然''*''解释原则上是正确的,但OP更直接的问题是在_backticks_中封入'*
    *'。 另外,尽管'>。*'而不是'> *'确实有效,但值得指出的是只要'>'会执行,因为该行的其余部分不需要匹配。 – mklement0

    1

    你的双引号字符串包含反引号大约*<br>*command substitution的一个实例),这意味着Bash将尝试执行*<br>*作为命令 - 这会因各种原因而失败 - 并将表达式扩展为由该命令生成的stdout输出。

    由于失败命令不产生标准输出输出时,`...`表达式扩展到null(空)串,这意味着grep将看到以下字符串文字:
    ^myprop.*=."

    任何行开头myprop,最后是=,并且至少有1个字符。与此正则表达式匹配,而不管以下内容 - 这就是myprop2行匹配的原因。

    如果反引号的意思是一致的文字,你既可以逃脱他们为\`或使用 -quoted字符串代替。
    (如果您认为*字符必须在带引号的字符串中转义以便从字面上理解:它们不会 - 只有未加引号使用需要转义)。

    然而,karakfa's helpful answer正确意味着,即使你不括在反引号*<br>*,以下>与重复符号*意味着任何>实例的数量 - 包括无 - 匹配。

    由于grep匹配默认线的子串,这有效地相匹配任何其余部分的线,其中包括与/>开始,因此其相匹配<br/>太。

    因此,虽然下面>.*代替*不解决这个问题,这是没有必要的 - 与>将做结束的正则表达式。

    GNUgrep溶液(因为只有GNU grep支持-P选项使支持PCREs,使这些特征作为先行断言),因此可以简化为:

    grep -oP 'myprop.*(?==.*<br>)' MyProject.properties 
    

    注使用单个引号,这是不需要插值的字符串的更好选择,以保证其原样使用。

    如果使用GNU grep不是一个选项,使用(注意,没有理由使用xargs):

    grep '^myprop.*=.*<br>' MyProject.properties | cut -d '=' -f 1 
    

    另外,使用awk

    awk -F= '$1 ~ /^myprop/ && $2 ~ /<br>/ { print $1 }' MyProject.properties 
    

    或者,如果这只是关于匹配,不管属性名称

    awk -F= '$2 ~ /<br>/ { print $1 }' MyProject.properties 
    
    +0

    我只是喜欢你的答案......并感谢你付出的精力。帽子掉了! –

    +0

    @NoviceUser:我很欣赏那些不错的反馈;我很高兴你找到了有用的答案。 – mklement0

    相关问题