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 0aASCII^Mの 13 番目の文字はなぜですか?
  2. 末尾の記号「0a」がドット「.」で表示されるのはなぜですか? 「。」16進数で「2E」です。
4

5 に答える 5

9

Unix と Windows では、行末の形式が異なります。Unix の世界では、行は改行文字 (LF、ascii char 10) で終わります。Windows では、改行が続くキャリッジ リターン (CR、ASCII 文字 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文字を生成しますが、カーソルを左右に動かすと、全体が 1 文字としてスキップされることがわかります入力^した後にM. 表示されている間^M、コマンド ライン プログラムは生データのみを認識し、実際のキャリッジ リターン文字を認識します。

なぜ 5E 4d 0a、つまり ^M は ASCII の 13 番目の文字なのですか?

hexdumpの出力を実行しました。これにより、a 、a 、および改行文字 (LF)echo "^M"の 3 つの文字が生成されます。上記を参照してください。これはキャリッジ リターンとは異なります。^M

末尾の記号 0a が . と表示されるのはなぜですか? . は 12 月で 2E です。16 進数の 5E は DEC で 94、4d は DEC で 77 です。

Hexdump は.、キャリッジ リターンやライン フィード文字を含む、印刷できないすべての文字を文字として表示します。


*なぜ特に M なのですか? 規約では、ASCII コードに 64 を追加します。キャリッジ リターンは ASCII コード 13 (0x0D) です。64 を追加すると、大文字の M である 77 (0x4D) が得られます。完全なリストについては、このページを参照してください。

于 2010-04-17T15:43:20.540 に答える
0

dos2unixそのプログラムがシステムで利用可能な場合は、 を介してファイルを実行すると、運が良くなる可能性があります。

特にdos2unix、Windows の \r\n 行末を Unix スタイルの \n 行末に変換します。

于 2010-04-17T18:40:58.273 に答える
0

ヘルパーの質問への回答

I. なぜ 5E 4d 0a、つまり ^M は ASCII の 13 番目の文字なのですか?

改行は0aです。以下の ZyX が提供する例を参照してください。rjh は 13 番目の文字について何かを明確にしました。「エコーが出力の最後に改行を追加するのを防ぎます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」がドット「.」で表示されるのはなぜですか? 「。」16進数で「2E」です。

TODO: 誰かがすでにこれに答えましたか? コメント、回答、または編集してください。

例に役立つ情報

ASCII から 16 進数

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

16 進数から ASCII へ: これを使用して、16 進数の意味を確認します

$ 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

^M 1 文字 - キャリッジ リターンは dos/windows、または ASCII 13 文字です。おそらくWindowsファイルなどから何かを貼り付けることによって、何らかの形で入力を侵害したようです...

于 2010-04-17T15:47:13.390 に答える