확장에서 다른 수의 공백 문자를 사용하는 이유는 무엇입니까?

확장에서 다른 수의 공백 문자를 사용하는 이유는 무엇입니까?

확장 명령이 각 탭 문자를 정확히 8개의 공백 문자로 변환하지 않는 이유는 무엇입니까?

예를 들어:this^Iis^Itabs ( ^I탭 문자를 나타냄)

이 되다:this____is______tabs____ (빈칸을 표시하려면 밑줄을 추가하세요)

바꾸다:this________is________tabs________

내 테스트에 따르면 Expand는 단어 경계에서 탭 문자 앞의 모든 문자를 가져온 다음 탭 문자를 원하는 공백 수로 변환하여 총 8자(해당 단어 경계 내의 문자 포함)를 추가하는 것으로 보입니다.

왜 그런 겁니까?

매뉴얼 페이지에서는 이 동작에 대한 어떤 힌트도 제공하지 않습니다.

답변1

expand유틸리티는 문자를 tab다음 암시적 탭 정지로 확장합니다. 역사적으로 이러한 문자는 기본적으로 8자마다 있지만 options 를 사용하여 변경할 수 있습니다 -t.

printf "%s\t%s\t%s\n" 12345 1234 123
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10
12345     1234      123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10,16
12345     1234  123

실제로 8개의 공백으로 바꾸려면 다음을 tab사용할 수 있습니다 sed.

printf "%s\t%s\t%s\n" 12345 1234 123 | sed 's/\t/        /g'

답변2

이것이 바로아이디어탭의 경우 다음 열로 이동하며 위치는 이전 필드의 너비에 따라 변경되지 않습니다. 예를 들어 두 번째 열을 적절하게 정렬하는 탭은 다음과 같습니다.

$ echo $'123\tfoobar\n123456\tblahblah'
123     foobar
123456  blahblah

두 줄에 동일한 수의 공백이 있으면 결과가 보기 흉해집니다.

123        foobar
123456        blahblah

8자 탭 정지의 경우 이는 물론 값이 0~7(또는 8~15 등) 문자인 경우에만 작동하며 8자 제한을 초과하는 변형은 다시 추악한 결과를 제공합니다.

$ echo $'123\tfoobar\n123.345e6\tblahblah'
123     foobar
123.345e6       blahblah

따라서 이를 위해서는 탭 정지를 다른 값으로 설정해야 합니다.

$ echo $'123\tfoobar\n123.345e6\tblahblah' | expand -t 12
123         foobar
123.345e6   blahblah

탭을 사용하는 대신 유사한 출력을 수행하는 또 다른 방법은 printf고정 너비 필드를 사용하는 것입니다(기본적으로 의 출력과 유사함 expand).

$ printf "%-11 %s\n" 123 foobar 123.345e6 blahblah
123          foobar
123.345e6    blahblah

답변3

이것매뉴얼 페이지expand 하다기본 탭 간격이 8자임을 나타냅니다.

-티,--탭=숫자

탭에서 8자가 아닌 NUMBER자가 잘림

이것정보 페이지(GNU 프로젝트는 매뉴얼 페이지를 선호합니다) 비슷하게 언급됨

기본 작업은 -t 8(8열마다 탭 설정)과 동일합니다.

그러나 더 구체적으로 말하면 탭은 각x 열터미널에서 삽입하는 대신x 공백 문자. 설명에서 언급했듯이 탭은 열 형식 지정을 위해 특정 열로 이동할 수 있도록 특정 오프셋에서 타자기에 연결된 물리적 클립이었습니다.

관련 정보