열을 사용하여 공백 대신 탭을 구분하려면 어떻게 해야 합니까?

열을 사용하여 공백 대신 탭을 구분하려면 어떻게 해야 합니까?

columnUnix 명령을 사용하여 일부 텍스트의 서식을 지정 하고 싶습니다 . 탭으로 구분된 필드가 있지만 각 필드 내에 공백도 있습니다. column공백(탭 및 공백)으로 구분됩니다. 열에서 탭 문자만 구분 기호로 사용하도록 하려면 어떻게 해야 합니까?

다음을 사용하여 탭 문자를 구분 기호로 지정하려고 합니다.

cat myfile | column -t -s"\t"

답변1

열 -t -s '\t'

\열은 및 문자로 구분됩니다 t.

column -s \tcolumn -s 't'쉘이 이를 인용 연산자로 해석하므로 백슬래시 와 동일합니다 .

여기서는 실제 탭 문자를 열에 전달하려고 합니다. ksh93, zsh, bash, mksh, busybox sh 또는 FreeBSD sh 사용:

column -ts $'\t'

Ctrl-V Tab셸 프롬프트에 입력하거나 (탭은 공백과 마찬가지로 셸 구문의 토큰 구분 기호이므로 따옴표 안에 또는 앞에 백슬래시가 붙음) 연산자를 사용하여 실제 탭 문자를 입력합니다. "$(printf '\t')"+glob에 필요한 큰따옴표 분할 비활성화) 탭 문자도 $IFS기본값인 )에 있기 때문입니다 .

답변2

POSIX의 경우 $'...'정의되지 않았습니다. 즉, ANSI-C 이스케이프입니다.

대신에 다음을 사용할 수 있습니다.POSIX$(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')011(10진수 9의 8진수 표현)은 가로 탭 문자에 대한 ANSI 코드이기 때문에 작동합니다 .

column -t -s "$(printf '\011')"

하지만 이번 리뷰에서는 그렇게 하지 않는 것이 좋습니다.그리고 Stéphane Chazelas의 답변. 이는 POSIX가 지정하지 않기 때문에 쉘 버전 간에 일관성이 없을 수 있기 때문입니다.코딩TAB의 값은 다음과 같습니다. C 로케일 인코딩이 EBCDIC를 기반으로 하는 POSIX 시스템이 여전히 있습니다. 여기서 TAB는 ASCII와 같이 9 대신 5입니다. \t이러한 문제를 방지하려면 가능할 때마다 이름(여기)으로 문자를 인용하는 것이 가장 좋습니다 . $'...'2018년 9월 10일부터 POSIX 사양의 다음 주요 버전에 포함될 예정입니다 .

답변3

나는 다음을 사용했습니다(텍스트에 가 포함되지 않은 경우에만 작동함 |).

cat myfile | tr '\t' '|' | column -t -s '|'

이는 탭 문자를 파이프로 바꾼 다음 파이프가 있는 열을 구분 기호로 사용합니다.

(아무것도 안보여서 이렇게 했어요스티븐의 대답상자에서 꺼내어 생선 껍질에 담아 준비합니다. 그렇지 않으면,스티븐의 대답좋아 보인다. )

답변4

-t원하는 열 수를 선택하는 데 사용됩니다 . 이 항목을 비워두면 아무 것도 변경되지 않습니다. 또한 그 뒤에 공백이 있어야 하므로 -s다음을 시도해 보십시오.

cat myfile | column -s \t

관련 정보