我们想知道通过使用 grep -E 选项来匹配一些变量名(包括它的 $ 前缀)的正确方法。
似乎这个 grep macthing 函数只能在没有任何选项或 -e 选项的情况下工作......
>
>
> grep ""'$'status"" /home/ewpadm/.sapenv_wzwms1.csh
if ( $status == 0 ) then
if ( $status == 0 ) then
set rc1 = $status
set rc2 = $status
set rc3 = $status
set rc4 = $status
set rc5 = $status
set rc6 = $status
set rc7 = $status
set rc8 = $status
>
>
> grep -E ""'$'status"" /home/ewpadm/.sapenv_wzwms1.csh
>
>
> grep -E """'$'status"""" /home/ewpadm/.sapenv_wzwms1.csh
>
>
> grep -e ""'$'status"" /home/ewpadm/.sapenv_wzwms1.csh
if ( $status == 0 ) then
if ( $status == 0 ) then
set rc1 = $status
set rc2 = $status
set rc3 = $status
set rc4 = $status
set rc5 = $status
set rc6 = $status
set rc7 = $status
set rc8 = $status
>
>
> grep -e "= "'$'status"" /home/ewpadm/.sapenv_wzwms1.csh
set rc1 = $status
set rc2 = $status
set rc3 = $status
set rc4 = $status
set rc5 = $status
set rc6 = $status
set rc7 = $status
set rc8 = $status
>
>
$
是 shell 的特殊字符(用于引入一些扩展,例如$param
,$(cmdsubst)
,$((arithmetic))
)和正则表达式(在所有basic中,扩展(-E
,以前是egrep
),perl(-P
/-X perl
/--perl-regexp
...),增强(-X
/--augmented-regexp
) ) 意味着在主题的末尾匹配,所以你需要为两者转义它,最好是 with'...'
for shells 和 with\$
or[$]
in regular expressions (\
并且[...]
在大多数 shells 中也很特殊,也可以用 引用'...'
):在基本 RE(没有
-E
/-P
/-X
...)中,$
仅在正则表达式的末尾或在某些情况下在 a 之前是特殊的,\)
所以这里的正则表达式可以是$status
,而在其他正则表达式变体(包括扩展变体)中,它通常总是特殊的,因此正则表达式必须是\$status
或[$]status
。对固定字符串使用(以前的)
-F
选项可以避免进行正则表达式转义。类似 perl 的正则表达式也有引用。所以,很多选择:grep
fgrep
\Q...\E
非标:
在某些 shell 中,
\
and"
也可以用作引号运算符,但反斜杠 and$
通常在 中仍然很特殊"..."
,所以在这里会很尴尬。'...'
是最强烈的引号(在一些 shell 中,例如rc
and derivatives,唯一的引号),您通常希望在 regexp 周围使用的引号也是最强的引号,其中许多运算符 ( )^$*?\[](){}|
在大多数 shell 的语法中也恰好是特殊的。无论如何,那些也会
$status
在里面找到$status2
,$status_old
或者$statusing
$$status
($$
接着是status
)\$status
$status
或任何按字面意思引用的csh 引用而且不会发现
${status}
${status[1]}
(订阅)${status:q}
(修饰符)$#status
或${#status}
(字数)$%status
或${%status}
(字符数)@ status++
/if ( status == 0 ) then
(变量可以(有时)在没有$
前缀的情况下使用的数学表达式)。使用词边界运算符(
\b
在 perl 或增强正则表达式中,\b
或\>
在[[:>:]]
BRE 或 ERE 的某些实现中作为非标准扩展)将有助于解决第一类问题:没有单词边界,可以手动完成:
我们在其中寻找
$status
后跟变量名的非组成字符或行尾的字符,或者在没有交替运算符的 BRE 中寻找,但现在相当于 ERE\{0,1\}
,?
可选$status
地后跟一个非 -可变成分和直到行尾的任意数量的字符。再说几个:
¹ 尽管有些
grep
实现\|
将其作为非标准扩展。