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
>
>
答え1
$
$param
、、$(cmdsubst)
などの一部の拡張子を紹介するために使用されるシェル特殊文字$((arithmetic))
とすべて基本的な、拡大する(-E
、前にegrep
)、真珠( -P
// -X perl
) --perl-regexp
,改善(-X
/ --augmented-regexp
))はトピックの終わりの一致を意味するため、両方ともエスケープする必要があります。'...'
シェルと正規表現の場合は、or inを使用することをお勧めします\$
(ほとんどのシェルではComeを使用することもできます)。[$]
\
[...]
'...'
基本 RE( -E
// -P
... なし-X
) では$
正規表現の終わり、または場合によっては a 以前にのみ特別なので、\)
ここで正規表現は にすることができますが、$status
他の正規表現の変形 (拡張正規表現を含む) では一般的に常に特別なので正規表現\$status
はでなければなりません[$]status
。
(以前)-F
オプションの使用grep
fgrep
固定文字列正規表現エスケープを実行する必要はありません。 Perlなどの正規表現を\Q...\E
引用に使用することもできます。したがって、さまざまなオプションがあります。
grep -F '$status'
grep '$status'
grep '\$status'
grep '[$]status'
grep -E '\$status'
grep -E '[$]status'
非標準:
grep -P '\$status'
grep -P '[$]status'
grep -P '\Q$status\E'
grep -X '\$status'
grep -X '[$]status'
一部のシェルでは\
andを"
参照演算子として使用することもできますが、バックスラッシュと$
inはまだ特殊なケースが多い"..."
ため、ここでは厄介です。'...'
は最も強力な引用符(およびrc
派生語などの一部のシェルでは唯一の引用符)なので、通常は正規表現の周りにこれらの引用符を使用したいと思います。ここでは、多くの演算子(^$*?\[](){}|
)もほとんどのシェル特殊構文で使用されます。
とにかく、それらも$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の一部の実装では非標準拡張)を使用すると、最初の種類の問題を解決するのに役立ちます\>
。[[:>:]]
grep -P '\$status\b'
単語の境界がない場合は、これを手動で実行できます。
grep -E '\$status([^_[:alnum:]]|$)'
grep '$status\([^_[:alnum:]].*\)\{0,1\}$'
私たちが探しているのは、$status
変数名や行末の一部ではない文字または交互演算子1がないが、\{0,1\}
ERE todayと同等の文字があり、後に変数がない文字があるBREの文字です?
。$status
行末までのコンポーネントと文字数に制限はありません。
より多くの問題を解決してください:
grep -P '\$\{?[#%]?status\b'
grep -E '\$\{?[#%]?status([^_[:alnum:]]|$)'
grep '${\{0,1\}[#%]\{0,1\}status\([^_[:alnum:]].*\)\{0,1\}$'
1一部のgrep
実装では、\|
これを非標準拡張として含めます。