我在这个正则表达式上挣扎了好几天。我有这样的文字:
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
我希望使用NULL
或其他终端命令匹配l
和grep
。是否可以在不使用组的情况下直接匹配它们?
我尝试使用(?<=^alias )(?<=-g).+
但没有结果。
答案 0 :(得分:3)
您可以使用以下grep命令,该命令使用PCRE正则表达式。
grep -oP '^alias(?:\s+-g)?\s+\K[^=]+(?==)' file
OR
grep -oP '^alias(?:\s+-g)?\s+\K\w+' file
OR
$ grep -oP '^alias(?:\s+-g)?\s+\K[^=]+' file
NULL
l
\K
会丢弃先前在匹配时打印的匹配字符。
\K
使文本与整个正则表达式匹配保持匹配。
答案 1 :(得分:3)
这可能看起来有点粗糙,但它非常易读,如如果是别名声明,请抓取别名文字
grep ^alias test | grep -oP "\w+(?==)"
答案 2 :(得分:2)
您可以使用此awk
:
awk '$1=="alias"{p=$0; sub(/=.*$/, ""); split($0, a, " "); sub(/^.*# /, "", p);
print a[length(a)] ":", p}' file
NULL: redirect output
l: list all
答案 3 :(得分:1)
$ awk 'sub(/^alias[^=]* /,"") && sub(/=.*/,"")' file
NULL
l