다음과 같은 내용을 포함하는 스크립트가 있다고 가정해 보겠습니다.
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 \$\{.*%
더 나쁜 것은 와일드카드가 인용되지 않기 때문에 쉘이 와일드카드를 현재 작업 디렉토리에서 이름이 시작하고 끝나는 파일 목록으로 확장할 수 있기 때문입니다*
.${
%