는이 같은 라인이 :대체 문에서 십진수로 16 진수를 변환하는 방법은 무엇입니까?
패드 (2) = 0x0041
I 소수점으로 칸을 변경하고 싶어하고, 예상 결과
패드 (2) =
(65) 난 그냥 :%s/\(.*\) = \(.*\)/\1 = \=printf("%d", submatch(2))
을 시도했지만 실패했습니다.
해결 하시겠습니까?
는이 같은 라인이 :대체 문에서 십진수로 16 진수를 변환하는 방법은 무엇입니까?
패드 (2) = 0x0041
I 소수점으로 칸을 변경하고 싶어하고, 예상 결과
패드 (2) =
(65) 난 그냥 :%s/\(.*\) = \(.*\)/\1 = \=printf("%d", submatch(2))
을 시도했지만 실패했습니다.
해결 하시겠습니까?
Vim은 다른 숫자 표현을 십진수 값으로 변환하는 str2nr()
함수를 가지고 있습니다. 문서에 따르면,
s/0x[0-9a-fA-F]\+/\=str2nr(submatch(0), 16)
귀하의 코드는 거의 확인하지만, : : 16 진수 값을 변환하려면이처럼 사용할 수
대체 문자열 시작 \ "="를 가진 나머지는 표현식으로 해석됩니다. 재귀 적으로 작동하지 않습니다. 안에 substitute() 함수가 있습니다.이 표현식은 대체 문자열에 "\ ="을 사용할 수 없습니다.
그래서, 당신은 오
%s/\(.*\) = \(.*\)/\=submatch(1)." = ".printf("%d", submatch(2))
안녕 ZyX, 대단히 감사합니다. 나는 너의 방법을 시도 할 것이다. 이제 로그를 변환하는 좋은 방법이 있습니다. :-) – stefanzweig
만약 당신이 처음 반쪽 (그냥 매치)에서 아무것도 바꾸지 않는다면, 대체 된 문자열의 시작 부분을 바꾸기 위해'\ zs '를 사용하는 것이 좋습니다 : – rampion
'% s/pad (. *)) = \ zs0x [0-9a-fA-F] \ +/\ = print ("% d", submatch (2))' – rampion
에 코드를 변경할 수 있습니다. 고맙습니다. 당신의 방법은 매우 유용합니다. 하지만 명령문에 [a-f]가 있으면 메소드가 실패합니다. – stefanzweig
@stefan : 물론 그렇습니다. :) 해당 문자를 포함하도록 일치 항목을 확장해야합니다. – sth
대단히 고마워요. 그것은 확실히 작동합니다. – stefanzweig