我属性文件grep的精确匹配不工作
myprop2=this is with <br/>
当我想为什么发现myprop2到grep为<br>
grep "^myprop.*=.`*<br>*`" MyProject.properties | xargs | cut -d '=' -f 1
?
注:我发现的<br>
代替<br/>
(没有结束标记)
我属性文件grep的精确匹配不工作
myprop2=this is with <br/>
当我想为什么发现myprop2到grep为<br>
grep "^myprop.*=.`*<br>*`" MyProject.properties | xargs | cut -d '=' -f 1
?
注:我发现的<br>
代替<br/>
(没有结束标记)
右角支架使得*
后0次以上,从而安全地在比赛中被忽略。我想你的意思是...>.*
此外,使用前瞻就可以消除一些管道
grep -oP "myprop.(?==.*<br>.*)" file
将给予同样没有xargs的切
你的双引号字符串包含反引号大约*<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
我只是喜欢你的答案......并感谢你付出的精力。帽子掉了! –
@NoviceUser:我很欣赏那些不错的反馈;我很高兴你找到了有用的答案。 – mklement0
太棒了! ..多谢... –
'grep'解决方案很有帮助,但你应该提到它需要_GNU_' grep'。虽然''*''解释原则上是正确的,但OP更直接的问题是在_backticks_中封入'*
*'。 另外,尽管'>。*'而不是'> *'确实有效,但值得指出的是只要'>'会执行,因为该行的其余部分不需要匹配。 – mklement0