正则表达式:多个回顾
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
或其他终端命令匹配 NULL
和 l
。是否可以不使用组直接匹配?
我尝试使用 (?<=^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
几天来我一直在为这个正则表达式而苦苦挣扎。我有这段文字:
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
或其他终端命令匹配 NULL
和 l
。是否可以不使用组直接匹配?
我尝试使用 (?<=^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