변수를 사용하여 vim 정규식을 바꾸는 방법

변수를 사용하여 vim 정규식을 바꾸는 방법

다음 형식의 여러 줄이 포함된 큰 파일이 있습니다.

USet07-1
USet07-2
USet08-1
USet08-2
.
.
.
USet22-2
.
.
.

-.NET의 이러한 문자열에서 하이픈/대시를 제거 하고 싶습니다 vim. 다음을 사용하여 문자열을 검색합니다.

:/USet\d\d-\d

하지만 이것을 다음으로 바꾸려고 할 때

:%s/Uset\d\d-\d/USet\d\d\d

나는 분명히 이해한다

USetddd

모든 경우에. 하지만 내가 원하는 것은 :

USet071
USet072
USet081
USet082
.
.
.
USet222
.
.
.

이것이 어떻게 달성될 수 있습니까? 일치 문자열의 일부를 재사용하여 교체에 사용할 수 있습니까?

답변1

예, 가능합니다.캡처 그룹. 기본적으로 패턴의 다양한 부분을 다음으로 래핑 \(...\)하고 교체 부분에서 해당 부분을 다음으로 참조합니다 \1.

:%s/Uset\(\d\d\)-\(\d\)/USet\1\2

당신이 원하기 때문에제거하다패턴의 단일 부분으로, \zs(일치 시작) 및 \ze(일치 종료)를 통해 실제 일치를 제한하는 더 짧은 옵션이 있습니다(그러나 여전히 주변 항목도 있다고 주장함).

:%s/Uset\d\d\zs-\ze\d//

이는 매우 기본적인 사항이며 캡처 그룹은 sed많은 정규식 기반 도구에서 일반적입니다(예: 명령을 찾고 내장된 를 탐색하는 방법을 알아보세요 :help. 포괄적이고 많은 팁을 제공합니다. Vim을 다른 편집자만큼 빨리 배울 수는 없지만 지속적인 학습에 전념한다면 Vim은 매우 강력하고 효율적인 편집기임이 입증될 것입니다.

답변2

vim도움을 주셔서 감사합니다 . 부분 문자열 일치를 사용하여 직접 솔루션을 찾았습니다.

:%s/\(USet\d\d\)-\(\d\)/\1\2/gc

답변3

Using sed command

sed "/^USet/s/-//" filename >outputfile

Suppose if you want to perform on orginal file

sed -i "/^USet/s/-//" filename

산출

USet071
USet072
USet081
USet082

awk 명령

awk '/^USe/{sub("-","",$0);print }' filename >outfile

output

USet071
USet072
USet081
USet082

답변4

\v패턴 접두사를 사용하면 정규식을 더 쉽게 사용할 수 있습니다. 이렇게 하면 도망갈 필요 가 없습니다 (.{[

:%s/\vUSet(\d\d)-(\d)/USet\1\2/

관련 정보