터미널 출력에 단위 구분 기호(ASCII 31)가 표시되지 않는 이유는 무엇입니까?

터미널 출력에 단위 구분 기호(ASCII 31)가 표시되지 않는 이유는 무엇입니까?

단위 구분 기호 ASCII 문자(ASCII 31, 8진수 37)는 Vim에서 ^_. 이로 인해 행의 필드가 서로 달라붙습니다.

# In Vim and less:

first field^_second field^_last field

# cat the same file to terminal:
cat delim.txt
first fieldsecond fieldlast field

# print 2nd field with awk 
cat delim.txt | awk 'BEGIN {FS = "\037"} {print $2}'
second field

단위 구분 기호를 표시하려면 cat -v를 사용할 수 있다고 생각합니다.

cat -v delim.txt
first field^_second field^_last field

그런데 이게 더 문제다. Bash 셸에서 stdout으로 인쇄할 때 단위 구분 기호에 눈에 보이는 표현이 없는 이유는 무엇입니까? 쉘 출력을 올바르게 복사하여 붙여 넣을 수도 없습니다. 단위 구분 기호가 프로세스에서 손실됩니다.

답변1

US라고도 하는 단위 구분 기호( ) 문자는 문자 클래스 IS1에 속하며 다음과 같습니다.cntrl아니요print캐릭터 클래스 에요 . 텍스트를 그룹으로 구성하는 데 사용되는 제어 문자이며,이 정보를 활용하도록 설계된 프로그램의 경우. 일반적으로 인쇄할 수 없는 문자는 프로그램이나 환경에 따라 다르게 해석되고 렌더링될 수 있습니다.

Vim에서 표시되는 이유는 ^_Vim이 대화형 편집기이기 때문입니다. 올바른 이진 문자가 디스크에 기록되는 한 인쇄할 수 없는 문자를 마음대로 렌더링할 수 있습니다.

Unix 쉘 프로그램은 일반 텍스트를 조작하고 일반 텍스트를 서로 전달하도록 작성되었기 때문에 쉘에서는 동일한 동작을 얻을 수 없습니다. 파일을 생성할 때 cat터미널에 기록된 텍스트는 파일의 실제 내용이어야 합니다.

이는 문자를 해석하는 것을 최종 장치에 맡깁니다. 일부 터미널 에뮬레이터는하다US다른 캐릭터와 차별화된 캐릭터를 만들어 보세요 . ( gnome-terminal또는 vte이를 기반으로 하는 모든 터미널) 문자는 16진수 코드를 포함하는 상자로 렌더링됩니다 001F. xterm또는 에서는 rxvt캐릭터가 실제로 보이지 않습니다.

답변2

단위 구분 기호의 ASCII 범위는 다음과 같습니다.제어 문자, 따라서 시각적 표현이 없거나 일반적으로 없어야 합니다.

Vim과 일부 다른 편집자들은 편집할 수 있도록 이를 표시합니다. 눈치채셨듯이 cat -v그것도 나타납니다. 매뉴얼 페이지에서는 이것이 인쇄할 수 없는 문자를 파일의 원래 내용이 아닌 인쇄할 수 있는 표현으로 대체하게 하는 의 -v축약된 형식임을 보여 주므로 출력이 실제로 다른 프로그램에서 나온 경우 문제가 발생할 수 있습니다.--show-nonprinting

여러분이 보는 표현은 이미 제어 문자임을 암시합니다. a 앞에 오는 문자는 터미널에서 해당 문자를 생성하는 키 조합인 + 문자의 일반적인 표현 ^입니다 . Ctrl예를 들어, Ctrl+를 사용하면 vim에 단위 구분 기호를 입력할 수 있습니다. _그러나 다른 편집기나 일부 GUI 뷰어에는 16진수 코드, 자리 표시자 또는 완전히 다른 내용이 표시될 수 있습니다.

터미널은 제어 문자를 인쇄하지 않으므로 텍스트를 선택할 때 복사되지 않습니다(줄 바꿈 및 탭과 같은 공백 문자는 여기에서 예외이며 제어 문자이기도 합니다). 복사할 때 종종 무시되는 터미널 제어 문자의 또 다른 예는 색상 코드입니다. 색상 코드는 ESC문자 뒤에 텍스트 색상을 지정하는 데 사용되는 코드입니다.

따라서 터미널에 문자를 표시하려면 단위 구분 기호를 인쇄 가능한 문자로 바꾸는 프로그램을 사용하는 것 외에는 다른 방법이 없습니다.

답변3

변경하고 싶다면 다른 (매우 좋은) 답변의 가장자리에 약간오직파일 내용을 표시할 때 제어 문자를 사용 ^_하는 것이 좋습니다.음역tr유틸리티(및 일부 bash 호환 구문)를 사용합니다 .

# Replace the control character US (^_) by *one* other character
$ cat my.file | tr $'\c_' ':'

해당 제어 문자를 "확장" 형식으로 바꾸려면 다음이 필요합니다 sed.

# Replace the control character US (^_) by any string
cat /tmp/f | sed s/$'\c_'/^_/g

구문에 유의하십시오 $'\cX'. 이 구문은 (bash 호환 쉘)에게 적절한 제어 문자를 바꾸도록 지시합니다. 바라보다Wikipedia의 제어 문자 별칭 목록"캐럿"을 사용하십시오. 이 구문이 마음에 들지 않으면 8진수 $'\037'또는 16진수 $'\x1f'표기법을 사용하는 것이 좋습니다.

관련 정보