리터럴 달러 기호가 포함된 정규식에 ripgrep 사용

리터럴 달러 기호가 포함된 정규식에 ripgrep 사용

다음과 같은 내용을 포함하는 스크립트가 있다고 가정해 보겠습니다.

VAR=${VAR1%.*}

나는 다음과 같은 명령을 찾고 있습니다

rg "${.*%"

찾고 싶었지만 가까이 갈 수가 없었어요.

모두 실패했다

rg "\$\{.\*%"
rg \$\{.\*%
rg "\$\{.*%"
rg \$\{.*%

답변1

$, \정규식 및 쉘에 특별합니다(후자의 큰따옴표 포함). {일부 상황에서는 셸에만 적용되며 목록은 셸마다 다릅니다.

실제로 많은 정규식 연산자( *, ?, |, {, }, (, ), \, 적어도 ) 도 쉘 구문에서 특별합니다 ^($[]일부쉘에 관계없이), 따라서 정규식을 작은따옴표로 묶는 것이 더 좋습니다. 대부분의 쉘에서는 모든 문자가 특별한 의미를 잃습니다(있는 경우).

그래서:

rg '\$\{.*%'

'...'탈출할 곳모두쉘의 문자(여기서 \(참조 연산자), $(확장 연산자) 및 *(glob 연산자)는 특수하고 때로는 %(작업 확장 연산자))이 이스케이프되고 정규식입니다 \.${

또는:

rg '[$][{].*%'

rg최신 확장 정규식의 특수 연산자와 유사한 perl정규식을 이해합니다. {x,y}그러나 주의할 점은기초적인grep-E// -P/ 가 없으면 -A/ 로 이해되는 정규식은 특별하지 않지만 -X특별합니다! 그래서 당신은해야합니다{}\{\}아니요{/를 이스케이프 처리하여 }문자 그대로 처리합니다 (또는 grep기본적으로 sed// ed/ ex... vi).

정규식을 다음과 같이 변경해야 할 수도 있습니다.

rg '\$\{[^}]*%'

내부 일치를 피하기 위해 .(모든 단일 문자와 일치)를 [^}](를 제외한 모든 단일 문자와 일치 )로 바꿉니다 .}

물건${foo}는 20%입니다.${bar} 제품보다 저렴함

예를 들어.

귀하의 시도를 살펴보십시오.

  • rg "\$\{.\*%"rg '$\{.\*%', 이는 특별한 의미를 제거하기 위해 이를 \사용하는 대부분의 쉘과 동일합니다 . 이 문자는 큰따옴표 안에 특수 문자가 아니기 때문에 이전에 $유지하세요 .\{*
  • rg \$\{.\*%, 와 동일합니다 rg '${.*%'. \따옴표 외부에는 또 다른 인용 연산자가 있습니다. (개행, 때로는 특별한 경우) \x와 같습니다 . 셸 에서는 , , , ... 이스케이프 시퀀스 와 함께 사용할 수도 있습니다 .'x'`!fish\\n\t\a\377
  • rg "\$\{.*%", 같은 rg '$\{.*%', 매우 가까운
  • rg \$\{.*%더 나쁜 것은 와일드카드가 인용되지 않기 때문에 쉘이 와일드카드를 현재 작업 디렉토리에서 이름이 시작하고 끝나는 파일 목록으로 확장할 수 있기 때문입니다 *.${%

관련 정보