sed는 4개의 공백을 2로 변환합니다.

sed는 4개의 공백을 2로 변환합니다.

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

이는 선행 공백 시퀀스만 압축해야 합니다.

관련 정보