通过 grep 正则表达式断言提取字符串

Mic*_*udl 0 grep string regular-expression

假设一个文本字符串my_string

$ my_string="foo bar=1ab baz=222;"
Run Code Online (Sandbox Code Playgroud)

我想提取关键字baz和分号之间的字母数字字符串。

如何使用正则表达式断言修改以下 grep 代码以排除尾随分号?

$ echo $my_string | grep -oP '(?<='baz=').*'
222;
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 5

除非您要提取的字符串本身可能包含;,否则最简单的事情可能是将.(匹配任何单个字符)替换为[^;](匹配除 之外的任何字符;

$ printf '%s\n' "$my_string" | grep -oP '(?<='baz=')[^;]*'
222
Run Code Online (Sandbox Code Playgroud)

通过grep链接到 libpcre 7.2 或更高版本,您还可以使用以下形式简化lookbehind \K

$ printf '%s\n' "$my_string" | grep -oP 'baz=\K[^;]*'
222
Run Code Online (Sandbox Code Playgroud)

这些将打印字符串中的所有匹配项,并假设匹配文本不包含换行符(因为grep单独处理每行输入)。