다음 형식의 코드가 있습니다 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