단위 구분 기호 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'
표기법을 사용하는 것이 좋습니다.