공백으로 구분된 숫자가 포함된 .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