소수점 이하 5자리를 모두 찾아 한자리씩 추가

소수점 이하 5자리를 모두 찾아 한자리씩 추가

공백으로 구분된 숫자가 포함된 .txt 파일이 있습니다.

40.766375 -84.267443
40.766355 -84.267463
40.766325 -84.263443
...

경우에 따라 첫 번째 열에 소수점 이하 6자리가 없는 숫자가 있는 경우가 있습니다.

40.76632 -84.263443

이 문제가 발생할 때마다 끝에 0을 삽입하여 다음과 같은 결과를 얻고 싶습니다.

40.766320 -84.263443

줄이 너무 많아서(36000개 이상) 정규식을 사용하여 이 작업을 수행하고 싶습니다. 어떤 아이디어가 있나요?

편집: 비슷한 것이 필요한 것 같은데 :%s/\.d{5}/\.d{5}0 거기에 갈 수 없습니다.

답변1

:%s/\(\.\d\{5\}\) /\10 /

이것은 당신이 원하는 것을 할 수 있습니다.

설명하다

\(\.\d{5\}\)처음으로 나타나는 점( \.)과 다섯 개의 숫자( )를 캡처 합니다 \d\{5\}. 또한 캡처 그룹 뒤에 공백을 남겨서 정확히 5개의 캡처 그룹이 있는지 확인합니다.

교체의 두 번째 부분에서는 \1첫 번째(그리고 한 번) 캡처 그룹에 액세스하는 데 사용하며, 0그 뒤에 공백을 넣고 해당 공간이 정규식과 일치하지만 두 번째 부분으로 전송되지 않기 때문에 공백을 넣습니다.

그룹 캡처에 대한 일부 정보: \10정확히 "그룹 번호 1 캡처, 그 뒤에 0이 옵니다". 따라서 8개의 그룹에만 액세스할 수 있습니다.

답변2

모든 숫자에 마침표 뒤에 6자리 숫자가 있도록 하는 보다 일반적인 방법으로 다음을 수행할 수 있습니다.

:%s/\.\d\+/&00000/g
:%s/\.\d\{6}\zs\d*//g

첫 번째는 5개의 0을 추가하고 두 번째는 마침표 뒤의 처음 6자리를 제외한 모든 숫자를 제거합니다. \zs이는 vim일치하는 부분의 시작 부분을 재설정하는 것과 같습니다 perl.\K

다음을 수행할 수도 있습니다.

 :%s/\d\+\.\d\+/\=printf("%.6f", str2float(submatch(0)))/g

관련 정보