grepの-Eオプションを使用して特定の変数名を一致させる方法

grepの-Eオプションを使用して特定の変数名を一致させる方法

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オプションの使用grepfgrep固定文字列正規表現エスケープを実行する必要はありません。 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変数を(時々)使用できる数学的表現)$

単語境界演算子(\bperlまたは拡張正規表現、\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実装では、\|これを非標準拡張として含めます。

関連情報