unexpand 명령은 정확히 어떻게 작동합니까?

unexpand 명령은 정확히 어떻게 작동합니까?

확장되지 않음에 대한 몇 가지 설명을 읽었지만 이해하지 못하거나 예상대로 작동하지 않습니다.

다음 예를 고려해 보겠습니다.

[root@hope log]# echo "A12345678B" | tr '[1-8]' ' ' | unexpand -a
A        B
[root@hope log]# echo "A12345678B" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000   A  ht  sp   B  nl
0000005
[root@hope log]# echo "A12345678B12345678C" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000   A  ht  sp   B  ht  sp  sp   C  nl
0000011
[root@hope log]# echo "12345678" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000  ht  nl
0000002

8개의 공백을 탭 문자로 바꾸는 것을 보았지만 공백이 아닌 문자가 나타날 때마다 추가 공백이 추가됩니다.

bash-4.3.42-3.fc23.x86_64 및 coreutils-8.24-6.fc23.x86_64 사용

이 동작을 설명해 주시겠습니까?

답변1

unexpand프로그램은 단순히 공백 8개를 탭 문자로 바꾸는 것이 아닙니다. 탭 문자로 인해 줄을 표시하는 데 사용되는 터미널이 다음 줄로 이동한다고 가정하여 줄의 공백과 탭을 대체합니다.탭 정지. 일반적으로 이러한 간격은 8칸이지만 대부분의 터미널에서는 간격이 변경될 수 있습니다(그리고 간격은 각 역마다 변경될 수 있습니다).

첫 번째 예제 문자열은 "A12345678B"숫자 1-8을 공백으로 바꿉니다. 결과의 처음 8자는 탭 나누기입니다. 이렇게 하면 첫 번째 탭(8이 있는 위치)에 공백이 남습니다. 이 unexpand프로그램은 그렇지 않습니다다음에 추가space; unexpand1-7의 공백을 탭으로 바꾼 후 남은 것.

탭을 사용하면 unexpand대부분 공백(또는 공백과 탭의 혼합)을 포함하는 파일을 일관된 형식으로 변환할 수 있습니다. 같은 이유로 공백으로 시작하는 줄이 많은 파일은 탭을 사용하는 파일보다 훨씬 클 수 있습니다(들여 쓰기). 또한 파일을 변환하여 사용하는 데 사용됩니다.다른예를 들어, 탭 정지는 탭 정지 세트에 맞춰 열이 정렬된 테이블을 더 넓거나 더 좁게 만듭니다.

서로 다른 탭 간격 간의 변환은 다음과 같이 수행할 수 있습니다.

expand -t 1,6,11,16,21 foo | unexpand -t 1,9,17,25,33 >bar

탭 정지 설정 외에도단말기, 일부 프로그램(예: vi)은 탭 간격이 다른 텍스트를 표시할 수 있습니다.

추가 읽기

관련 정보