unexpand 명령은 여러 탭을 어떻게 처리합니까?

unexpand 명령은 여러 탭을 어떻게 처리합니까?

확장되지 않은 설명서를 읽고 답변을 읽어 보았습니다.여기하지만 unexpand가 tablist를 매개변수로 사용하는 방법을 이해하지 못합니다.

다음을 시도하면 (공백 2개와 공백 3개가 탭으로 변환될 것으로 예상됨)

$ unexpand -t 2,3,4
  12**345***678

알겠어요

12\t\t345***678

*공간을 나타냅니다( *명확성을 위해 이것을 사용함). 공백이 3개 있는데 왜 2 뒤에는 탭이 두 개 있고 5 뒤에는 탭이 없는지 모르겠습니다.

또한 다음을 시도했습니다(두 번째 및 다섯 번째 열의 공백이 탭으로 변환될 것으로 예상).

$ unexpand -t 2,5
  1*23*4567

알겠어요

1*23*4567

나도 시도했다

$ unexpand -t 2,5
  1**2*****345

알겠어요

1\t*2*****345

매개변수가 여러 개인 경우 프로그램이 tablist 매개변수를 어떻게 해석하는지 이해할 수 없습니다.

답변1

unexpand그 반대로 하세요 expand. 이렇게 하면 unexpand -t 2,3,4 | expand -t 2,3,4원래 있던 곳으로 돌아가야 합니다.

이 숫자는 탭 사이의 거리가 아니라 위치(화면 왼쪽으로부터의 거리)를 나타냅니다.

첫 번째 탭 정지를 오프셋 2(세 번째 열)로 설정 -t 2,3,4하고, 두 번째 탭 정지를 오프셋 3으로, 세 번째 탭 정지를 오프셋 4로 설정하면 그게 전부입니다.

  ↓↓↓
0123456
$ printf '%b|\n' '\t' '\t\t' '\t\t\t' | expand -t2,3,4
  |
   |
    |

1, 2, 3 탭은 다음 위치에 있습니다.

  123

이것을 다음과 결합하면:

  123
12**345***678

3세 번째 탭 정지에 있으므로 거기 2에 가려면 두 개의 탭이 필요합니다. 첫 번째 탭은 두 번째 탭 정지로 이동하고(이미 첫 번째 탭 정지에 도달했으므로) 두 번째 탭은 두 번째 탭 정지로 이동합니다. 세 번째 탭 정지. 그 이후에는 탭이 없으므로 공백이 탭으로 변환되지 않습니다.

두 번째 탭 정지가 두 번째 탭 정지 뒤의 3열이 되도록 하고 세 번째 탭 정지가 두 번째 탭 정지 뒤의 4열이 되도록 하려면 다음이 필요합니다 -t 2,5,9.

  ↓  ↓   ↓
0123456789
$ printf '\t1\t2\t3\n' | expand -t 2,5,9
  1  2   3

그러면 다음을 얻게 됩니다:

          ↓  ↓   ↓
        01234567890
$ echo '12  345   678' | unexpand -t 2,5,9 | sed -n l
12  345\t 678$

unexpand( ) 와 tabs(지원하는 터미널에 탭을 설정하는 명령) 의 차이점에 유의하세요 .

  • 의 경우 tabs열은 0이 아닌 1부터 시작하여 번호가 매겨집니다.
  • tabs -8(대신 ) 8개 열마다 탭 정지 설정을 사용합니다 expand -t 8(실제로는 이와 비슷 tabs 9 17 25 33...하지만 그것도 사용할 수 있습니다 tabs 9 +8 +8 +8...).

관련 정보