vim regex는 여러 연속 공백을 하나의 공백으로 만 바꿉니다.
나는 종종 단어 구분 기호로 다양한 양의 공백을 가진 텍스트 파일로 작업합니다 (Word와 같은 텍스트 프로세서는 특정 글꼴의 문자 크기가 다르기 때문에 공백 양을 상당히 분배하기 위해이 작업을 수행하며 이러한 경우에도 성가신 가변 양의 공백을 넣습니다. 일반 텍스트로 저장).
가변 길이를 가진 공백 시퀀스를 단일 공백으로 바꾸는 프로세스를 자동화하고 싶습니다. 나는 정규식이 그것을 할 수 있다고 생각하지만 단락의 시작 부분에도 공백이 있습니다 (일반적으로 4 개이지만 항상 그런 것은 아님), 변경하지 않고 싶으므로 기본적으로 내 정규식은 또한 선행 공백을 건드리지 않아야합니다. 복잡성을 추가합니다.
나는 vim을 사용하고 있으므로 이것이 가능하다면 vim 정규식 방언의 정규식이 나에게 매우 유용 할 것입니다.
내 현재 진행 상황은 다음과 같습니다.
:%s/ \+/ /g
하지만 제대로 작동하지 않습니다.
또한 텍스트 줄을 하나씩 구문 분석하고, 각 줄을 문자별로 처리하고, 첫 번째 줄 이후 공백을 건너 뛸 수있는 vim 스크립트를 작성하는 것을 고려하고 있지만 이것이 과도하다고 생각합니다.
실용주의를 위해 저는 3 단계 과정으로하는 경향이 있습니다.
:g/^ /s//XYZZYPARA/g
:g/ \+/s// /g
:g/^XYZZYPARA/s// /g
더 나은 방법 (아마도 매크로 또는 순수한 정규식 방법을 사용하는 것)이있을 수 있다는 것을 의심하지 않지만 일반적으로 서두를 때 이것이 작동합니다. 물론으로 시작하는 줄이 있으면 XYZZYPARA
문자열을 조정할 수 있습니다. :-)
회전하기에 충분합니다.
This is a new paragraph
spanning two lines.
And so is this but on one line.
으로:
This is a new paragraph
spanning two lines.
And so is this but on one line.
곁에 :
:g
대신 내가를 사용 하는 이유가 궁금하다면:s
대부분 습관 일뿐입니다.:g
할 수있는 모든 것을:s
할 수 있습니다. 실제로 선택한 줄 에서 임의의 명령 을 실행하는 방법 입니다.s
이 경우 실행할 명령은 우연히 발생 하므로 실제 차이는 없지만vi
고급 사용자 가되고 싶다면:g
언젠가 살펴 봐야 합니다.
이것은 2 개 이상의 공백을 대체합니다
s/ \{2,}/ /g
또는 \+
버전 앞에 추가 공간을 추가 할 수 있습니다.
s/ \+/ /g
이것은 트릭을 할 것입니다.
%s![^ ]\zs \+! !g
\zs
및 \ze
메타 시퀀스를 사용하면 다른 정규식 방언보다 Vim에서 더 쉽게 많은 대체를 수행 할 수 있습니다 . 그들이하는 일은 시퀀스 앞의 부분 ( \zs
, "s"는 "여기에서 시작"을 의미) 또는 뒤 부분 ( \ze
, "e"는 "여기서 끝")을 최종 결과에서 제외하는 것입니다. 이 경우, 패턴은 첫 번째 비 공백 문자와 일치해야합니다 ( [^ ]
)하지만 다음은 \zs
최종 경기 결과 (대체 될 것입니다) 시작 말한다 후에 그 문자.
줄로 시작하는 공백 앞에 공백이 아닌 문자를 넣을 방법이 없기 때문에 패턴과 일치하지 않으므로 대체로 대체되지 않습니다. 단순한.
여기에는 많은 좋은 대답이 있습니다 (특히 Aristotle의 : \zs
그리고 \ze
배울 가치가 있습니다). 완전성을 위해 부정적인 look-behind 어설 션으로이 작업을 수행 할 수도 있습니다.
:%s/\(^ *\)\@<! \{2,}/ /g
이것은 " ' \{2,}'
'줄의 시작과 0 개 이상의 공백'이 앞에 나오지 않는 2 개 이상의 공백 ( ) 찾기"이라고 말합니다 . 백 슬래시 수를 줄이려면 다음을 수행 할 수도 있습니다.
:%s/\v(^ *)@<! {2,}/ /g
하지만 두 캐릭터 만 구할 수 있습니다! 중복 변경 (예 : 단일 공간을 단일 공간으로 변경)을 수행하는 데 신경 쓰지 않는 경우 ' +'
대신 사용할 수도 있습니다 ' {2,}'
.
공백이 아닌 단일 문자 만 확인하기 위해 부정적인 look-behind를 사용할 수도 있습니다.
:%s/\S\@<!\s\+/ /g
이것은 (조금의 타이핑을 절약하기 위해 공백과 탭을 동일하게 처리하기 위해 약간 수정 된 Aristotle의 버전)과 거의 같습니다.
:%s/\S\zs \+/ /g
보다:
:help \zs
:help \ze
:help \@<!
:help zero-width
:help \v
그리고 (모두 읽으십시오!) :
:help pattern.txt
작동합니까?
%s/\([^ ]\) */\1 /g
이 버전이 마음에 듭니다. Aristotle Pagaltzis의 미리보기 버전과 비슷하지만 이해하기가 더 쉽습니다. (아마도 \ zs에 대한 나의 생소함)
s/\([^ ]\) \+/\1 /g
또는 모든 공백
s/\(\S\)\s\+/\1 /g
나는 그것을 "공백이 아닌 다른 어떤 것의 모든 발생에 뒤이어 여러 개의 공백을 무언가와 하나의 공간으로 대체한다"라고 읽었다.
답변 됨; 하지만 어쨌든 내 작업 흐름을 던져 버릴 것입니다.
%s/ / /g
@:@:@:@:@:@:@:@:@:@:@:@:(repeat till clean)
빠르고 간단하게 기억할 수 있습니다. 위의 훨씬 더 우아한 솔루션이 있습니다. 하지만 내 .02.
'Programing' 카테고리의 다른 글
urllib와 같은 mock / stub 파이썬 모듈은 어떻게 할 수 있습니까? (0) | 2020.11.16 |
---|---|
UISearchDisplayController가 탐색 모음을 숨기지 못하도록 방지 (0) | 2020.11.16 |
jQuery UI datepicker에서 오늘 날짜를 기본 날짜로 설정 (0) | 2020.11.16 |
$ a + ++ $ a == 2 인 이유는 무엇입니까? (0) | 2020.11.16 |
Visual Studio Code가 EJS 파일의 HTML 구문을 인식하도록하는 방법이 있습니까? (0) | 2020.11.16 |