1- 공백이 있고 탭을 원하는 경우
먼저, 하나의 탭을 가질 공간 수를 결정해야합니다. 즉, 앞에 4 개의 공백이있는 줄이 있다고 가정하거나 8 ... 탭이 4 개의 공백이되기를 원할 것입니다. 이제 그 정보로 다음을 수행하십시오.
:set ts=4
:set noet
:%retab!
여기에 문제가 있습니다! 이 일련의 명령은 줄의 시작 부분에 공백뿐만 아니라 모든 텍스트를 찾습니다. 그것은 다음과 같은 문자열을 의미합니다 : "Hey,␣this␣␣␣␣is␣4␣spaces"
will 될 "Hey,␣this⇥is␣4␣spaces"
것이지만 그렇지는 않습니다! 그 탭!.
이 작은 문제를 해결하기 위해 search
대신을 추천합니다 retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
이 검색은 전체 파일에서 탭 수로 시작하여 4 개의 공백으로 시작하는 행을 찾은 다음 찾은 탭 수에 1을 더한 값으로 대체합니다.
불행히도 이것은 한 번에 실행되지 않습니다!
처음에는 파일에 공백으로 시작하는 줄이 있습니다. 그러면 검색은 처음 4 개의 공백 만 탭으로 변환하고 다음을 수행합니다.
명령을 반복해야합니다. 몇 번이나? 당신이 얻을 때까지 pattern not found
. 아직 프로세스를 자동화하는 방법을 생각할 수 없습니다. 그러나 당신이 할 경우 :
`10@:`
아마 끝났을 것입니다. 이 명령은 마지막 검색 / 바꾸기를 10 번 반복합니다. 프로그램에 너무 많은 들여 쓰기가 없을 것입니다. 그렇다면 다시 반복하십시오 @@
.
이제 답을 완성하십시오. 나는 당신이 반대를 요구했다는 것을 알고 있지만, 언제 일을 취소해야하는지 결코 알지 못합니다.
2 탭이 있고 공백이 필요합니다.
먼저 탭을 변환 할 공간 수를 결정하십시오. 각 탭을 2 칸으로하고 싶다고합시다. 그런 다음 다음을 수행하십시오.
:set ts=2
:set et
:%retab!
이것은 문자열과 같은 문제가 있습니다. 그러나 문자열 내부에서 하드 탭을 사용하지 않는 더 좋은 프로그래밍 스타일로 실제로 여기서 좋은 일을하고 있습니다. 문자열 안에 탭이 정말로 필요하다면을 사용하십시오 \t
.
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
)가 선행 공백뿐만 아니라 모든 공백을 변환하는 것으로 나타납니다. 두 번째 예 (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
)에서는 각 줄의 첫 번째 공백 만 탭으로 바꾸고 나머지는 남겨 둡니다.