为什么错误“非法字符:^ M”?

时间:2010-04-17 15:38:08

标签: windows unix format ascii zsh

我得到了一些我无法理解的格式问题,下面是使用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,即^M,是ASCII中的第13个字符?
  2.   
  3. 为什么结尾符号“0a”显示为点“。”? “。”在Hex中是“2E”。
  4.   

5 个答案:

答案 0 :(得分:8)

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",它产生了三个字符:^M和换行符(LF)。见上文,这与回车不一样!

  

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

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


*为什么M特别?惯例是在ASCII代码中添加64。回车符是ASCII码13(0x0D)。添加64,你得到77(0x4D),这是一个大写M.请参阅this page获取完整列表。

答案 1 :(得分:0)

^ M在一个字符中 - 回车符是dos / windows或ASCII 13字符。似乎你以某种方式损害了你的输入,可能是通过粘贴来自Windows文件或类似的东西......

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

帮助者问题的答案

  

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

     
    

换行符是0a,请参阅下面的ZyX提供的示例。 rjh澄清了关于第13个问题的一些事情。 echo -n阻止echo在其输出结尾添加换行符”。我正在使用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
  
     

<强> II。为什么结尾符号“0a”显示为点“。”? “。”在Hex中是“2E”。

     

TODO:有人回答过这个吗?请评论,回答或编辑。

有关示例的信息

  

ASCII到HEX

`.` 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

答案 4 :(得分:0)

我通过从<a href>上删除了此问题来解决了

~/.gitconfig

出于某种原因并自动将[core] autocrlf = true 附加到我的vim-plug插件中并破坏了neovim。