1

我遇到了一些我无法理解的格式问题,下面是一个使用 Zsh 的简短示例。为什么?

$ values=( 300 400 )
$ echo "scale=20; $values[1]-$values[2]" | bc
(standard_in) 1: illegal character: ^M         // Why does it not print -100?
$ echo $values                                 // no ^M sign found!
300 400

帮助问题

  1. 为什么5E 4d 0a, 即^MASCII 中的第 13 个字符?
  2. 为什么结尾符号“0a”显示为点“.”?这 ”。” 是十六进制的“2E”。
4

5 回答 5

9

Unix 和 Windows 有不同的行结束格式。在 Unix 世界中,行以换行符(LF,ascii char 10)结束。Windows 以回车符(CR,ascii char 13)后跟换行符结束行。

具有 Windows 行结尾的文件必须先转换为 Unix 格式,然后才能使用 Unix 工具。否则,就像您的情况一样,诸如bc将 CR 字符视为垃圾和抱怨之类的程序。

要将文件转换为 Unix 格式,您可以dos2unix(1)在已安装的情况下使用它,或者将其传递sed 's/^M//g'(但不要输入文字 ^M - 按 Ctrl+V,然后按 Ctrl+M)。

那为什么^M?嗯,回车是一个不可打印的字符。它没有可打印的表示。为方便起见,您的终端会将其显示为^M*. 那么为什么在你出现的时候没有出现echo $values呢?不幸的是,命令行参数处理将其剥离,因此您看不到它。

同样为了您的方便,您的终端允许您通过 Ctrl+V 和 Ctrl + 某个字母键入不可打印的字符。Ctrl+V 和 Ctrl+M 将产生一个^M字符,但是左右移动光标,您会看到它作为单个字符跳过整个内容 -键入^后跟M. 当看到^M时,命令行程序只能看到原始数据,并且会看到一个实际的回车符。

为什么 5E 4d 0a,即 ^M,ASCII 中的第 13 个字符?

hexdump在 的输出上运行echo "^M",它产生三个字符: a ^、 aM和换行符 (LF)。见上文,这和回车不一样!

为什么结尾符号 0a 显示为 .?. 12 月是 2E。十六进制数 5E 在 DEC 中是 94,在 DEC 中 4d 是 77。

Hexdump 将所有不可打印的字符显示为.字符,包括回车符和换行符。


*为什么是M?惯例是将 64 添加到 ASCII 代码中。回车是 ASCII 码 13 (0x0D)。添加 64 得到 77 (0x4D),这是一个大写的 M。请参阅此页面以获取完整列表。

于 2010-04-17T15:43:20.540 回答
0

^M 在一个字符中 - 回车是 dos/windows 或 ASCII 13 字符。似乎您以某种方式破坏了您的输入,可能是通过从 Windows 文件中粘贴某些内容或类似的内容...

于 2010-04-17T15:47:13.390 回答
0

如果您通过 运行文件dos2unix,如果该程序在您的系统上可用,您可能会有更好的运气。

除其他外,dos2unix会将 Windows 的 \r\n 行尾转换为 Unix 风格的 \n 行尾。

于 2010-04-17T18:40:58.273 回答
0

助手问题的答案

一、为什么5E 4d 0a,即^M,ASCII中的第13个字符?

换行符是0a,请参见下面 ZyX 提供的示例。rjh 澄清了关于第 13 个字符的一些事情。“防止 echo 在其输出末尾添加换行符echo -n。我正在使用 Debian。

$ echo "scale=20; $values[1]-$values[2]" | hexdump -C
00000000  73 63 61 6c 65 3d 32 30  3b 20 5b 31 5d 2d 5b 32  |scale=20; [1]-[2|
00000010  5d 0a                                             |].|
00000012
xyz@xyz:~$ echo -n "scale=20; $values[1]-$values[2]" | hexdump -C
00000000  73 63 61 6c 65 3d 32 30  3b 20 5b 31 5d 2d 5b 32  |scale=20; [1]-[2|
00000010  5d                                                |]|
00000011

二、为什么结尾符号“0a”显示为点“.”?这 ”。” 是十六进制的“2E”。

TODO:有人已经回答了吗?请评论、回答或编辑。

帮助示例的信息

ASCII 到十六进制

`.` is `2E` in Hex
`5E` is `^` in Hex 
`4d` is `M` in Hex

十六进制到 ASCII:用这个看看 Hex -things 是什么意思

$ echo "^M" | hexdump -C
00000000  5e 4d 0a                                          |^M.|
00000003
$ ascii -x              
    0 NUL    10 DLE    20      30 0    40 @    50 P    60 `    70 p 
    1 SOH    11 DC1    21 !    31 1    41 A    51 Q    61 a    71 q 
    2 STX    12 DC2    22 "    32 2    42 B    52 R    62 b    72 r 
    3 ETX    13 DC3    23 #    33 3    43 C    53 S    63 c    73 s 
    4 EOT    14 DC4    24 $    34 4    44 D    54 T    64 d    74 t 
    5 ENQ    15 NAK    25 %    35 5    45 E    55 U    65 e    75 u 
    6 ACK    16 SYN    26 &    36 6    46 F    56 V    66 f    76 v 
    7 BEL    17 ETB    27 '    37 7    47 G    57 W    67 g    77 w 
    8 BS     18 CAN    28 (    38 8    48 H    58 X    68 h    78 x 
    9 HT     19 EM     29 )    39 9    49 I    59 Y    69 i    79 y 
    A LF     1A SUB    2A *    3A :    4A J    5A Z    6A j    7A z 
    B VT     1B ESC    2B +    3B ;    4B K    5B [    6B k    7B { 
    C FF     1C FS     2C ,    3C <    4C L    5C \    6C l    7C | 
    D CR     1D GS     2D -    3D =    4D M    5D ]    6D m    7D } 
    E SO     1E RS     2E .    3E >    4E N    5E ^    6E n    7E ~ 
    F SI     1F US     2F /    3F ?    4F O    5F _    6F o    7F DEL
于 2012-09-19T17:11:56.990 回答
0

我通过从~/.gitconfig

[core]
  autocrlf = true

^M由于某种原因,它自动附加到我的 vim-plug 插件并破坏了 neovim。

于 2019-08-14T19:46:35.890 回答