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구현에서는 \|이를 비표준 확장으로 포함합니다.

관련 정보