如何使用grep正向后瞻与前瞻功能从字符串中提取指定单词
解决方案
要使用grep的正向后瞻、正向前瞻提取目标单词,首先需要给grep加-P参数启用Perl兼容正则(PCRE)——grep默认的基础/扩展正则模式不支持零宽断言语法。
严格匹配前后边界的命令
如果要严格限定目标词位于captcha_decode userEnteredCaptcha 之后、 Line 3之前,执行以下命令即可:
echo "$fullString" | grep -oP '(?<=captcha_decode userEnteredCaptcha )poting(?= Line 3)'
如果目标词不是固定值,要提取两个边界之间的任意单词,把中间的poting换成匹配单词的正则即可,比如匹配连续非空格字符:
echo "$fullString" | grep -oP '(?<=captcha_decode userEnteredCaptcha )[^ ]+(?= Line 3)'
正则语法说明
(?<=xxx):正向后瞻语法,标记匹配位置的前缀必须是xxx,这部分内容不会被纳入最终匹配结果(?=xxx):正向前瞻语法,标记匹配位置的后缀必须是xxx,这部分内容不会被纳入最终匹配结果-o参数:仅输出匹配到的片段,而非输出整行内容-P参数:启用PCRE正则引擎,支持零宽断言语法
更通用的简化写法
如果不需要严格匹配后缀 Line 3,只需要提取captcha_decode userEnteredCaptcha后面紧跟的第一个单词,可以省略前向断言,适配性更强:
echo "$fullString" | grep -oP '(?<=captcha_decode userEnteredCaptcha )[^ ]+'
执行以上所有命令,最终都只会输出目标内容:
poting
注意:写正则的时候不要遗漏前后缀里的空格,否则会因为空格匹配失败提取不到内容;另外引用shell变量时建议给变量加双引号,避免字符串里的特殊字符导致解析异常。
内容的提问来源于stack exchange,提问作者sriganesh
相关产品推荐
相关产品推荐

