VI에서 검색 및 바꾸기

VI에서 검색 및 바꾸기

MS SQL에서 작동하려면 아래 문자열에서 '12.22.54'를 '12:22:54'로 변환해야 합니다.

cast('14-JAN-14 06.65.22 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 12.22.36 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 22.13.54 AM' as datetime),'63.124.79.253');

vi에서 파일을 열고 다음과 같이 바꾸려고했습니다.

:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g

하지만 작동하지 않습니다. 도와주세요.

답변1

IP 주소를 피하기 위해 일치하는 문자열 주위에 공백을 넣습니다.

:%s/ \(\d\d\)\.\(\d\d\)\.\(\d\d\) / \1:\2:\3 /g

답변2

viPerl 스타일의 정규식을 사용하지 않습니다. 당신은 썼다

:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g

하지만 vi다음과 같은 구문을 사용합니다(vim과 vile은 수락 \d하지만 당신은 이렇게 말했습니다)"바이"):

:s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

("z"는 어디에서 왔습니까?)

요점은 Perl이 "더 이상 사용되지 않음"이라고 부르는 것이 역참조를 위한 POSIX 구문이라는 것입니다. 물론 Perl은 Larry Wall이 있는 동안에는 결코 표준화되지 않을 것입니다.

의견에 따르면 OP의 의도는 모든 줄을 변경하는 것이었습니다. vi에서는 특수 범위를 사용하여 수행됩니다 %.

:%s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

범위를 명시적으로 사용할 수도 있습니다($POSIX도 마찬가지입니다):

:1,$s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

IP 주소를 피하기 위해 경계를 구성하는 다른 방법이 있습니다. 그러나 주어진 예에서는 공백이면 충분합니다.

:s/ \([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\) / \1:\2:\3 /g

비슷하게,정력그리고비열한공백은 허용되지만 \sPOSIX는 리터럴 공백(표시된 대로) 또는 문자 클래스만 허용합니다 [:space:]. 대부분의 사람들 [spacetab][[:space:]].

언급한 대로 "vi"라고 말하면 다른 사람들은 표준(POSIX) 동작을 기반으로 대답하도록 선택할 수 있습니다. "vi" 대신 사용할 수 있는 일부 편집기는 정규식 구문에 대한 확장을 제공합니다. 빠른 확인 결과는 다음과 같습니다.엘비스또한 Perl 스타일 \d및 을 지원합니다 \s.엔비(네 가지 중 가장 표준을 준수하는 것)은 그렇지 않습니다.

관련 정보