
다음 형식의 여러 줄이 포함된 큰 파일이 있습니다.
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/