4개의 공백을 2개의 공백으로 변환하는 방법은 무엇입니까 sed
? 가능합니까?
이것을 찾았지만 탭을 공백으로 변환합니다.
sed -r ':f; s|^(\t*)\s{4}|\1\t|g; t f' file
답변1
게시한 스크립트는 해당 공백 앞에 탭만 있는 경우 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
대신에.
답변2
직접적인 접근 방식은 작동하지 않습니다.
sed -r 's/ {4}/ /g'
그렇지 않은 경우 실패한 부분에 일부 입력을 게시하십시오.
답변3
선행 공백만 변환되는 경우:
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'
'ts'
또한 vim 설정 및 :retab
명령을 살펴보십시오.
답변4
sed 's/ \{2,4\}\( \{0,1\}[^ ].*\)*/ \1/g' <input
이는 선행 공백 시퀀스만 압축해야 합니다.