私のシステム:
- Ubuntu 22.04.3 LTS
- GNU bash、バージョン 5.1.16(1)-リリース(x86_64-pc-linux-gnu)
man ls
-b
次のように説明します。
-b, --escape
print C-style escapes for nongraphic characters
これ「制御文字」のウィキペディアページ状態:
制御文字またはNPC(非印刷文字)は、書かれた文字や記号を表さない文字セットのコードポイントです。他のすべての文字は、「空白」文字を除いて、主に印刷文字(または印刷可能文字)とも呼ばれるグラフィック文字です。
これはあいまいです。
グラフィックではない文字が何であるか、この用語が印刷されていない文字とどのように異なるかを説明する権威あるソースはどこですか?
答え1
これグラフィック文字なりますisgraph()
/iswgraph()
標準関数は、trueまたは正規表現に一致する値[[:graph:]]
、つまりgraph
ロケールの文字クラス値を返します。
すべてPOSIX、クラスはprint
親セットでなければならず、分離しなければならgraph
ずcntrl
、graph
親セットでなければならず、空白(u + 0020)文字を含めてはいけません(他の空白文字は言及されていません)。upper
lower
alpha
digit
xdigit
punct
アイデアは比喩的な文字はインクで描いた文字で、印刷可能ビーコントローラーになります。
実際、GNUシステム(Ubuntuなど)は少なくともクラスに非制御文字をprint
追加します。これは、glibc 2.35(Ubuntu 22.04で使用されている)と、以下を含むUTF-8ロケールを使用します。graph
space
U+0020 SPACE
U+1680 OGHAM SPACE MARK
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE
space
授業には以下がありますが、
U+0009 CHARACTER TABULATION
U+000A LINE FEED
U+000B LINE TABULATION
U+000C FORM FEED
U+000D CARRIAGE RETURN
U+0020 SPACE
U+1680 OGHAM SPACE MARK
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE
答え2
このBashスクリプトは、ASCIIセットの各文字に関連する文字クラス(GNU / awkとして定義されている)を一覧表示します。
#! /bin/bash --
Awk='
BEGIN {
Ctl1 = "SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI ";
Ctl2 = "DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US SPACE";
split (Ctl1 Ctl2, Ctl); Ctl[0] = "NUL"; Ctl[127] = "DEL";
C = "cntrl print graph space blank punct alnum alpha digit lower upper xdigit";
split (C, Class);
}
function Char (n, ch, Local, j) {
printf ("0x%.2X %5s", n, (n <= 32 || n == 127) ? Ctl[n] : ch);
for (j = 1; j in Class; ++j)
if (ch ~ "[[:" Class[j] ":]]") printf (" :%s:", Class[j]);
printf ("\n");
}
{ for (j = 0; j < 128; j++) Char( j, sprintf ("%c", j)); }
'
echo | awk -f <( printf '%s' "${Awk}" )