vim 역참조 패키지 내용에 공백이 포함되지 않는 이유는 무엇입니까?

vim 역참조 패키지 내용에 공백이 포함되지 않는 이유는 무엇입니까?

다음 형식의 코드가 있습니다 print 'hi' # sample comment.

:%s/^\([^#]*\)\(#.*\)/\2\r \1/gc저는 vim에서 형식을 변경 하곤 했습니다 .
위의 명령을 사용하면 다음과 같은 결과를 얻습니다.

# sample comment
    print 'hi'\s\s\s\s\s\s\s\s\s\s\s         

\s결과에 표시하기 위해 사용하는 보이지 않는 추가 공간을 제외하고는 이것이 제가 원하는 것과 거의 같습니다.

\([^#]*\)vim 명령의 일부에는 해당 범위에 공백이 포함되지 않은 것 같습니다 .

왜 이런 일이 발생하며 어떻게 해결합니까?

답변1

이는 첫 번째 캡처 그룹 때문에 발생합니다.하다공백을 포함합니다.

    ^\([^#]*\)\(#.*\)
    | --------  -------- the comment 
begin    | 
    everything upto #
    including spaces

이 문제를 해결하려면 다음과 같이 캡처 그룹 외부에 공백을 유지해야 합니다.

   ^\(.\{-}\)\s*\(#.*\)
   |  ------  --   ------ comment
begin    |     \____ any amount of whitespace
  non-greedy match

그러면 다음과 같은 완전한 명령이 제공됩니다.

%s/^\(.\{-}\)\s*\(#.*\)/\2\r    \1/gc

관련 정보