ターミナル出力に単位区切り記号(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進コードを含むボックスとしてレンダリングされます001Fxtermまたは ではrxvt文字が実際には見えません。

おすすめ記事