什么是“M-符号”以及它的记录在哪里?

问题描述 投票:0回答:6

cat手册页说:

-v, --show-nonprinting
    use ^ and M- notation, except for LFD and TAB 

什么是

M-
符号以及它的记录在哪里?

示例:

$cat log -A
wrote 262144 bytes from file test.x in 9.853947s (25.979 KiB/s)^M$
^M> ^H^H  ^H^H>

^M
^H
是什么意思?

special-characters cat keycode notation non-printing-characters
6个回答
18
投票

我也想知道这个问题。我检查了源代码,但创建输入文件来获取映射似乎更容易。

我使用 Perl 脚本创建了一个测试输入文件

for( my $i=0 ; $i < 256; $i++ ) {  print ( sprintf( "%c is %d %x\n", $i, $i ,$i ) ); }
,然后通过 cat -v 运行它

如果您看到 M-oM-;M-?在文件的开头它是 UTF-8 字节顺序标记。

向下滚动查看 M 值:

^@ is 0 0
^A is 1 1
^B is 2 2
^C is 3 3
^D is 4 4
^E is 5 5
^F is 6 6
^G is 7 7
^H is 8 8
(9 is tab)
(10 is NL)
^K is 11 b
^L is 12 c
^M is 13 d
^N is 14 e
^O is 15 f
^P is 16 10
^Q is 17 11
^R is 18 12
^S is 19 13
^T is 20 14
^U is 21 15
^V is 22 16
^W is 23 17
^X is 24 18
^Y is 25 19
^Z is 26 1a
^[ is 27 1b
^\ is 28 1c
^] is 29 1d
^^ is 30 1e
^_ is 31 1f
...printing chars removed...
^? is 127 7f
M-^@ is 128 80
M-^A is 129 81
M-^B is 130 82
M-^C is 131 83
M-^D is 132 84
M-^E is 133 85
M-^F is 134 86
M-^G is 135 87
M-^H is 136 88
M-^I is 137 89
M-^J is 138 8a
M-^K is 139 8b
M-^L is 140 8c
M-^M is 141 8d
M-^N is 142 8e
M-^O is 143 8f
M-^P is 144 90
M-^Q is 145 91
M-^R is 146 92
M-^S is 147 93
M-^T is 148 94
M-^U is 149 95
M-^V is 150 96
M-^W is 151 97
M-^X is 152 98
M-^Y is 153 99
M-^Z is 154 9a
M-^[ is 155 9b
M-^\ is 156 9c
M-^] is 157 9d
M-^^ is 158 9e
M-^_ is 159 9f
M-  is 160 a0
M-! is 161 a1
M-" is 162 a2
M-# is 163 a3
M-$ is 164 a4
M-% is 165 a5
M-& is 166 a6
M-' is 167 a7
M-( is 168 a8
M-) is 169 a9
M-* is 170 aa
M-+ is 171 ab
M-, is 172 ac
M-- is 173 ad
M-. is 174 ae
M-/ is 175 af
M-0 is 176 b0
M-1 is 177 b1
M-2 is 178 b2
M-3 is 179 b3
M-4 is 180 b4
M-5 is 181 b5
M-6 is 182 b6
M-7 is 183 b7
M-8 is 184 b8
M-9 is 185 b9
M-: is 186 ba
M-; is 187 bb
M-< is 188 bc
M-= is 189 bd
M-> is 190 be
M-? is 191 bf
M-@ is 192 c0
M-A is 193 c1
M-B is 194 c2
M-C is 195 c3
M-D is 196 c4
M-E is 197 c5
M-F is 198 c6
M-G is 199 c7
M-H is 200 c8
M-I is 201 c9
M-J is 202 ca
M-K is 203 cb
M-L is 204 cc
M-M is 205 cd
M-N is 206 ce
M-O is 207 cf
M-P is 208 d0
M-Q is 209 d1
M-R is 210 d2
M-S is 211 d3
M-T is 212 d4
M-U is 213 d5
M-V is 214 d6
M-W is 215 d7
M-X is 216 d8
M-Y is 217 d9
M-Z is 218 da
M-[ is 219 db
M-\ is 220 dc
M-] is 221 dd
M-^ is 222 de
M-_ is 223 df
M-` is 224 e0
M-a is 225 e1
M-b is 226 e2
M-c is 227 e3
M-d is 228 e4
M-e is 229 e5
M-f is 230 e6
M-g is 231 e7
M-h is 232 e8
M-i is 233 e9
M-j is 234 ea
M-k is 235 eb
M-l is 236 ec
M-m is 237 ed
M-n is 238 ee
M-o is 239 ef
M-p is 240 f0
M-q is 241 f1
M-r is 242 f2
M-s is 243 f3
M-t is 244 f4
M-u is 245 f5
M-v is 246 f6
M-w is 247 f7
M-x is 248 f8
M-y is 249 f9
M-z is 250 fa
M-{ is 251 fb
M-| is 252 fc
M-} is 253 fd
M-~ is 254 fe
M-^? is 255 ff            

4
投票

^M
代表 Control-M(回车),
^H
代表 Control-H(退格)。
M-Something
是 Meta-Something(Meta- 是 Alt 键在某些终端中的作用)。


1
投票

我不确定

M-
表示法,但涉及
^
的表示法使用 插入符号

插入符号是 ASCII 中控制字符的表示法。

特别是,

二合字母代表控制字符,其 ASCII 码为 与最高位的字符 ASCII 码相同,7 位 编码,反转。

您可以通过查看 ASCII 二进制(八进制)表示来验证:

Source: http://www.asciitable.com 图片来源:http://www.asciitable.com

由于 ASCII 是一个有限的字符集(如上所示),因此可以直接列出由脱字符号表示法表示的所有控制字符,例如 http://xahlee.info/comp/unicode_character_representation.html


1
投票

您可以在

key_name(3)
手册页

中查看定义

同样,

meta
(3X)函数允许调用者更改
keyname
的输出,即它确定是否对“meta”键使用“M-”前缀(代码在128到255范围内) 。
use_legacy_coding
(3X) 和
meta
(3X) 仅在curses 初始化后才会成功。 X/Open Curses 没有记录代码 128 到 159 的处理。当将它们视为“元”键时(或者如果在初始化诅咒之前调用
keyname
),此实现返回字符串
“M-^@”
“M-^A”
等。

按键名称(3X)

所以基本上 Ctrl 版本的 Meta 模拟是 Ctrl + 128 键码。您可以在 Brian 的表格中轻松看到这一点。这是一个稍微修改过的版本,以便于比较

$ LC_ALL=C perl -e 'for( my $i=0 ; $i < 128; $i++ ) {
    print ( sprintf( "%c is %d %x\t\t%c is %d %x\n",
        $i, $i, $i, $i + 128, $i + 128, $i + 128 ) );
}' >bytes.txt

$ cat -v bytes.txt
^@ is 0 0       M-^@ is 128 80
^A is 1 1       M-^A is 129 81
^B is 2 2       M-^B is 130 82
^C is 3 3       M-^C is 131 83
...
^Y is 25 19     M-^Y is 153 99
^Z is 26 1a     M-^Z is 154 9a
^[ is 27 1b     M-^[ is 155 9b
^\ is 28 1c     M-^\ is 156 9c
^] is 29 1d     M-^] is 157 9d
^^ is 30 1e     M-^^ is 158 9e
^_ is 31 1f     M-^_ is 159 9f
  is 32 20      M-  is 160 a0
! is 33 21      M-! is 161 a1
" is 34 22      M-" is 162 a2
# is 35 23      M-# is 163 a3
$ is 36 24      M-$ is 164 a4
% is 37 25      M-% is 165 a5
& is 38 26      M-& is 166 a6
' is 39 27      M-' is 167 a7
( is 40 28      M-( is 168 a8
) is 41 29      M-) is 169 a9
* is 42 2a      M-* is 170 aa
+ is 43 2b      M-+ is 171 ab
, is 44 2c      M-, is 172 ac
- is 45 2d      M-- is 173 ad
. is 46 2e      M-. is 174 ae
/ is 47 2f      M-/ is 175 af
0 is 48 30      M-0 is 176 b0
1 is 49 31      M-1 is 177 b1
...
: is 58 3a      M-: is 186 ba
; is 59 3b      M-; is 187 bb
< is 60 3c      M-< is 188 bc
= is 61 3d      M-= is 189 bd
> is 62 3e      M-> is 190 be
? is 63 3f      M-? is 191 bf
@ is 64 40      M-@ is 192 c0
A is 65 41      M-A is 193 c1
B is 66 42      M-B is 194 c2
...
Z is 90 5a      M-Z is 218 da
[ is 91 5b      M-[ is 219 db
\ is 92 5c      M-\ is 220 dc
] is 93 5d      M-] is 221 dd
^ is 94 5e      M-^ is 222 de
_ is 95 5f      M-_ is 223 df
` is 96 60      M-` is 224 e0
a is 97 61      M-a is 225 e1
b is 98 62      M-b is 226 e2
...
z is 122 7a     M-z is 250 fa
{ is 123 7b     M-{ is 251 fb
| is 124 7c     M-| is 252 fc
} is 125 7d     M-} is 253 fd
~ is 126 7e     M-~ is 254 fe
^? is 127 7f        M-^? is 255 ff

右边

M-
后面的部分和左边一模一样,只是键码相差128


也可以查看cat的源码

*bpout++ = ch - 128;
案例中Meta key版本的基本表达是
show_nonprinting


1
投票

通过代码回答

coreutils cat src
https://github.com/coreutils/coreutils/blob/v9.3/src/cat.c#L415

busybox猫源代码
https://github.com/mirror/busybox/blob/1_36_0/libbb/printable.c#L43

        if (ch >= 128) {
            ch -= 128;
            *buf++ = 'M';
            *buf++ = '-';
        }
        if (ch < 32 || ch == 127) {
            *buf++ = '^';
            ch ^= 0x40;
        }
  • M-ⓒ 表示 ⓒ +128
  • ^ⓒ 表示 ⓒ -64
    • 或 ⓒ +64 如果 ⓒ 是
      ?
      // 等于
      \x7F

尝试一下

# setup raw input: so that ctrl+c, ctrl+d not terminate cat
$ stty raw

# try input: ctrl+a, ctrl+b.. //but alt+a, alt+b not got M-A, M-B
$ cat | hexdump -ve '1/1 " %02x\r\n"'
^@ 00
^A 01
^B 02
^C 03
^D 04
^E 05
^F 06

# end test, run in another terminal
$ killall hexdump

1
投票

书上的答案。

Unix 电动工具。

25.7 使用 cat -v 或 od -c 显示非打印字符。

cat -v
对于 ASCII 范围之外的字符及其高位设置有自己的符号,也称为元字符。
cat -v
将其打印为
M-
后跟另一个字符。
cat -v
输出中有两个:
M-^?
M-a
。要获得元字符,请添加 200 个八进制。 “说什么?”我们先来看看
M-a
。字母a的八进制值为141。当
cat -v
打印出
M-a
时,表示141+200相加得到的字符,即八进制341。您可以将字符猫打印解码为
M-^
?以同样的方式。
^?
代表DEL字符,八进制177。加上200+177得到八进制377。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.