正则表达式:多个回顾

Regex: multiple lookbehinds

几天来我一直在为这个正则表达式而苦苦挣扎。我有这段文字:

alias -g NULL="> /dev/null 2>&1"    # redirect output
test                                # don't match
alias l="ls -lahGF"                 # list all
PROMPT=$'$FG[237]'                  # don't match

我想使用 grep 或其他终端命令匹配 NULLl。是否可以不使用组直接匹配?

我尝试使用 (?<=^alias )(?<=-g).+ 但没有结果。

您可以使用以下使用 PCRE 正则表达式的 grep 命令。

grep -oP '^alias(?:\s+-g)?\s+\K[^=]+(?==)' file

grep -oP '^alias(?:\s+-g)?\s+\K\w+' file

$ grep -oP '^alias(?:\s+-g)?\s+\K[^=]+' file
NULL
l

\K 在最后打印时丢弃先前匹配的字符。 \K 将到目前为止匹配的文本保留在整个正则表达式匹配之外。

你可以使用这个awk:

awk '=="alias"{p=[=10=]; sub(/=.*$/, ""); split([=10=], a, " "); sub(/^.*# /, "", p); 
     print a[length(a)] ":", p}' file
NULL: redirect output
l: list all

这可能看起来有点粗糙,但它是非常可读的,如如果它是一个别名声明,抓住别名文字

grep ^alias test | grep -oP "\w+(?==)"
$ awk 'sub(/^alias[^=]* /,"") && sub(/=.*/,"")' file
NULL
l