Queremos saber sobre o método correto para combinar algum nome de variável (incluindo seu prefixo $) usando a opção grep -E.
Parece que esta função grep macthing só pode funcionar com nenhuma opção ou opção -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
>
>
$
é um caractere especial tanto para o shell (onde é usado para introduzir algumas expansões como$param
,$(cmdsubst)
,$((arithmetic))
) quanto para expressões regulares (em todas as expressões básicas , estendidas (-E
, anteriormenteegrep
), perl (-P
/-X perl
/--perl-regexp
...), aumentadas (-X
/--augmented-regexp
) ) onde significa combinar no final do assunto, então você precisa escapar para ambos, de preferência com'...'
for shells e com\$
ou[$]
em expressões regulares (\
e[...]
também são especiais na maioria dos shells e também podem ser citados com'...'
):No RE básico (sem
-E
/-P
/-X
...),$
é especial apenas no final do regexp ou, em alguns casos, antes de um,\)
então aqui o regexp pode ser$status
, enquanto em outras variantes do regexp, incluindo os estendidos, geralmente é sempre especial, portanto o regexp deve ser\$status
ou[$]status
.Usando a
-F
opção degrep
(anteriormentefgrep
) para strings fixas , evite ter que fazer o escape de regexp. regexps semelhantes a perl também têm\Q...\E
para aspas. Então, muitas opções:Fora do padrão:
Em alguns shells,
\
e"
também podem ser usados como operadores de citação, mas a barra invertida e$
geralmente ainda são especiais dentro de"..."
, o que tornaria estranho aqui.'...'
são as aspas mais fortes (e em alguns shells, comorc
e derivados, as únicas aspas), também são aquelas que você geralmente deseja usar em torno de regexp, onde muitos dos operadores ( )^$*?\[](){}|
também são especiais na sintaxe da maioria dos shells.Em qualquer caso, aqueles também encontrarão
$status
dentro$status2
,$status_old
ou$statusing
$$status
($$
seguido porstatus
)\$status
ou qualquer citação csh onde$status
é tomado literalmenteE não vai encontrar
${status}
${status[1]}
(assinatura)${status:q}
(modificadores)$#status
ou${#status}
(número de palavras)$%status
ou${%status}
(número de caracteres)@ status++
/if ( status == 0 ) then
(expressões matemáticas onde a variável pode (às vezes) ser usada sem um$
prefixo).Usar um operador de limite de palavra (
\b
em perl ou regexp aumentada,\b
ou\>
em[[:>:]]
algumas implementações de BRE ou ERE como extensões não padrão) ajudaria com a primeira categoria de problemas:Sem limite de palavra, isso pode ser feito manualmente:
Onde procuramos
$status
seguido de um caractere não constituinte de um nome de variável ou final de linha, ou em BRE que não possuem operador de alternância¹ mas hoje tem como equivalente a\{0,1\}
ERE?
,$status
seguido opcionalmente de um não componente-variável e qualquer número de caracteres até o final da linha.Para abordar mais alguns:
¹ Embora algumas
grep
implementações tenham\|
isso como uma extensão não padrão.