답변:
게시 한 스크립트는 4 * n 공백을 탭이 앞에있는 경우에만 4 개의 n 공백을 n 개의 탭으로 변환합니다.
4 개의 공백을 2 개의 공백으로 바꾸고 만 들여 쓰기 만하고 sed로 할 수는 있지만 대신 Perl을 권장합니다.
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
sed에서 :
sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~ /\1 ~/' -e 't r' -e 's/~//' file
indent
대신 사용할 수 있습니다 .
간단한 방법으로 작동하지 않습니다.
sed -r 's/ {4}/ /g'
그렇지 않은 경우 실패한 곳에 입력을 게시하십시오.
선행 공백 만 변환해야하는 경우 :
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
의견 :
sed '
h; # save a copy of the pattern space (filled with the current line)
# onto the hold space
s/[^ ].*//; # remove everything starting with the first non-space
# from the pattern space. That leaves the leading space
# characters
s/ / /g; # substitute every sequence of 4 spaces with 2.
G; # append a newline and the hold space (the saved original line) to
# the pattern space.
s/\n *//; # remove that newline and the indentation of the original
# line that follows it'
또한 vim의 'ts'
설정과 :retab
명령을보십시오
'ts'
및 :retab
문제에 대한 해결책이 아니라 관련되어 있으며 주소 전체 목표를 도움이 될 수 있습니다. 당신은 할 수있는 vim -- *.c
, :set ts=...
그리고 :argdo retab
나 :argdo retab!
. 'sw'
옵션 및 vim 자체 들여 쓰기 기능 도 참조하십시오 .
sed 's/^\( \+\)\1\1\1/\1\1/' file
선행 공백을 동일한 그룹의 4 개의 인스턴스로 나누고 (모두 동일) 그룹의 두 인스턴스로만 교체합니다.
\+
)를 사용하여 동일한 것을 쉽게 달성 할 수 있습니다 . 감사합니다.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.