如何让grep匹配最后一个${A57}至${A29}${A14}的内容?
解决方案:用grep匹配最后一个${A57}到指定结尾的内容
给定目标字符串:
${A57}${A17}${A23}${A20}${A35}${A57}${A33}${A24}${A38}${A38}${A24}${A17}${A57}${A33}${A23}${A38}${A18}${E52}${A28}${A28}${A28}${A25}${A38}${A22}${A50}${A30}${A57}${A37}${A18}${A44}${A15}${A28}${A29}${A29}${A29}${A29}${A14}
默认grep -o "${A57}.*${A29}${A14}"会匹配第一个${A57}到结尾的完整内容,因为正则的.*是贪婪匹配,会尽可能早地开始并匹配最长的结果。
要匹配最后一个${A57}到结尾的目标内容,可以使用GNU grep的Perl兼容正则扩展(-P选项),结合\K元字符实现:
grep -Po '.*\K${A57}.*${A29}${A14}' your_file.txt
原理说明:
.*:贪婪匹配所有字符,直到遇到最后一个${A57}(贪婪特性会优先匹配到最靠后的位置)\K:丢弃前面匹配的所有内容,只保留\K之后的匹配结果${A57}.*${A29}${A14}:匹配从最后一个${A57}开始,到${A29}${A14}结束的内容
执行上述命令后,输出结果就是:
${A57}${A37}${A18}${A44}${A15}${A28}${A29}${A29}${A29}${A29}${A14}
替代方案(无GNU grep时)
如果你的环境只有BSD grep(比如macOS默认的grep),可以用sed实现相同效果:
sed -n 's/.*\(${A57}.*${A29}${A14}\)/\1/p' your_file.txt
内容的提问来源于stack exchange,提问作者Nemsis
相关产品推荐
相关产品推荐

