vim에서 어떻게 매치를 욕심없이 만들 수 있습니까?


479

다음과 같은 마크 업이 많은 큰 HTML 파일이 있습니다.

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

모든 것을 제거하기 위해 Vim 검색 및 교체를 시도 class=""하고 style=""있지만 일치하지 않는 일치하는 데 어려움을 겪고 있습니다.

나의 첫번째 시도는 이것이었다

%s/style=".*?"//g

하지만 Vim은을 좋아하지 않는 것 같습니다 ?. 불행히도를 제거하면 ?경기가 너무 욕심이됩니다.

내 성냥을 어떻게 불쾌하게 만들 수 있습니까?


폴의 대답이 좋다고 생각합니다. 그냥 "?" (이것은 당신이 사용하는 무엇을 달성하고자하는 경우 "?") 정력에 있지 평균 옵션을 수행
LB40

14
@LB는 여러 언어로 제공됩니다. *? 모든 문자와 일치하지만 욕심이 없음을 의미합니다. 그것이 그가 달성하려는 것입니다.
랜디 모리스

답변:


734

대신에 .*사용 .\{-}.

%s/style=".\{-}"//g

또한 참조 :help non-greedy


37
매우 직관적이지 않은데, 이것은 vim만이하는 것입니까?
Ehtesh Choudhury

94
모든 정규 표현식 언어는 정규 표현식의 가장 큰 문제 중 하나입니다.
Patrick Farrell

35
이 도구들 중 많은 것들이 같은시기에 성숙해 왔고 정규 표현 언어의 자체 방언을 독자적으로 개발했습니다. 이러한 도구들 중 다수는 다른 문제를 해결하려고 노력했기 때문에 이러한 구현에서 구문이 크게 다를 수 있다는 것이 합리적입니다. 우리는 이것이 때때로 현실 세계가 개발자로서 우리의 삶을 어렵게 만들더라도 작동하는 방식이라는 것을 받아 들여야합니다. 운 좋게도 요즘에는 많은 툴이 최소한 Perl 호환 정규식 구현을 제공합니다. 불행히도 Vim은 그중 하나가 아닙니다.
랜디 모리스

15
나 같은 사람이 기본적으로 검색을 \v(매우 마술 플래그)로 설정하면을 사용하고 싶을 것 .{-}입니다.
jgillman

48
@Shurane @Ziggy Mnemonic : 반복 횟수 {1,3}(중괄호)를 제어합니다 . 빼기 부호 -는 가능한 한 적은 반복 (작은 == 빼기);)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

58

vim에서 욕심없는 검색은 {-} 연산자를 사용하여 수행됩니다. 이처럼 :

%s/style=".\{-}"//g

단지 시도:

:help non-greedy

48

무슨 일이야

%s/style="[^"]*"//g

7
내 자신의 이익을 위해, 나는 여전히 욕심없는 것을 더 잘 이해하고 싶습니다.
Mark Biek

17

PCRE 정규식 구문이 더 편하다면

  1. OP에서 요청한 것처럼 욕심없는 연산자?를 지원합니다. 과
  2. backwhacking 그룹화 및 카디널리티 연산자가 필요하지 않습니다 (리터럴 문자와 일치하지 않고 연산자를 지정하기 때문에 완전히 직관적이지 않은 vim 구문 요구 사항). 과
  3. 펄 기능으로 컴파일 된 [g] vim이 있습니다.

    : 기능을 검사하고 검사합니다. + perl이 있다면 잘 가야합니다)

를 사용하여 검색 / 바꾸기

:perldo s///

예. img 태그에서 src 및 alt 속성을 교체하십시오.

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>

1
perldo잘 작동하지만 불행히도 정규 표현식을 입력하는 동안 선택한 테스트를 강조 표시하지 않습니다.
mljrg

12

이 유형의 질문에 대한 좋은 해결책은 다음과 같습니다.

: %! sed ...

(또는 원하는 경우 perl). IOW는 vim의 정규 표현식을 배우기보다는 이미 알고있는 도구를 사용합니다. 펄을 사용하면? 수정자는 일치하지 않는 작업을합니다.


2
좋은 지적이지만 /pattern패턴을 적용하기 전에 패턴을 올바르게 일치시키고 cvim 정규 표현식에서 수정자를 사용하는 것도 확인하는 것이 좋습니다 :)
João Portela

이것이 맞습니다. 여기에있는 모든 솔루션은 욕심스럽지 않습니다! 텍스트가 많고 해당 패턴이 여러 번 나타나는 줄에서 [0-9] \ {7}을 일치시켜야하는 경우 여기서 해결책이 없습니다. 여기서 해결책은 단순한 것 (공평한 것, 요청 된 것)에서만 작동합니다. 그러나 다음 인용 때까지 검색보다 조금 더 많은 일을하는 경우 vim은 도움이되지 않습니다.
gcb

4

와 함께 \v(여러 의견에서 제안한 바와 같이)

:%s/\v(style|class)\=".{-}"//g

2

플러그인 eregex.vim 은 Perl 스타일의 욕심없는 연산자 *?+?


@xsilenT github.com/othree/eregex.vim : "Vundle 또는 병원체를 사용하여 스크립트를 설치하는 것이 좋습니다."
eXe

나는 Vundle 또는 병원체를 사용하는 방법을 모른다는 것을 유감스럽게 생각합니다.
xsilen T

-4

G'day,

Vim의 정규 표현식 처리는 그리 훌륭하지 않습니다. sed의 정규 표현식 구문이 vim의 기능과 올바르게 일치한다는 것을 알았습니다.

검색 강조 표시를 보통 (: set hlsearch)으로 설정 한 다음 슬래시를 입력 한 후 정규 표현식으로 재생하여 검색 모드로 들어갑니다.

편집 : Mark, 욕심 매칭을 최소화하는 트릭은 Dale Dougherty의 훌륭한 책 "Sed & Awk"( 위생 아마존 링크 ) 에서 다룹니다 .

3 장 "정규 표현식 구문 이해"는 sed 및 awk와 관련된보다 기본적인 정규 표현식 기능에 대한 훌륭한 소개입니다. 짧고 읽기만 권장합니다.

HTH

건배,


7
Vim의 정규식 처리는 실제로 꽤 좋습니다. 행 / 열 번호 일치 또는 키워드 또는 식별자 또는 공백과 같은 언어 별 문자 분류를 기반으로 일치하는 것과 같이 sed가 할 수없는 작업을 수행 할 수 있습니다. 또한 너비가 0 인 어설 션과 대체의 오른쪽에 식을 넣을 수 있습니다. 사용 \v하면 구문을 정리하는 데 도움이됩니다.
Brian Carper

1
@ 브라이언, 건배. 정규식을 도와 내가 누락 된 것을 볼 것입니다.
Rob Wells

@RobWells, Sed & Awk 는 실제로 매우 훌륭한 책 임호이며, 탐욕스럽고 게으른 정량 자에 대해서는 어떤 단어도 명시 적으로 사용하지 않습니다. 증거로,이 책에는 탐욕 이나 탐욕 이라는 단어가 전혀 없으며 , 게으르지 않은 단어가 하나만 있지만 관련이 없습니다 .
Enrico Maria De Angelis

@EnricoMariaDeAngelis이지만 예제는 용어를 명시 적으로 언급하지 않습니다. 욕심없는 일치를 달성하기 위해 "not"연산자를 사용하도록 정규식을 조정하는 방법에 관한 것입니다. 탐욕스럽고 게으른 용어는 욕심쟁이 경기 행동을 구체적으로 수정하기 위해 운영자를 소개했을 때 Perl의 NFA 엔진과 함께 도착했습니다.
Rob Wells
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.