【bash】^Mなどの制御文字(構文)の整理してみた

※アフィリエイト広告を利用しています
※アフィリエイト広告を利用しています

多くのLinuxサーバの管理って、Windowsで通常業務して、ターミナルでLinuxにログインすることが多いかと思っています。
自分はたまに改行コード変え忘れて、cat -Aとかで確認してガッカリしてます。

とりあえず。^Mとは?

^Mは、キャリッジリターン(Carriage Return)を表す制御文字です。
これはWindowsの改行コード CRLF\r\n)に含まれる \r(キャリッジリターン)の部分です。

LinuxやMacでは通常、改行コードは LF(Line Feed \n)のみが使われていますが、Windowsでは CRLF\r\n)が使われるため、Linux環境でWindowsのテキストファイルを開くと ^M が表示されることがあります。


^Mが表示される原因

Linuxでファイルを開いたときに ^M が表示されるのは、Windowsで作成されたテキストファイル(CRLF形式)をLinuxのエディタやコマンドで開いた場合です。

例:cat コマンドで表示

-A(または-e)で改行コードなどの制御文字が表示されます。


^Mの削除方法

Windowsから持ってきたファイルの ^M を削除する方法はいくつかあります。

方法1: dos2unix コマンド

dos2unix コマンドが使える環境であれば、dos2unixコマンドでWindowsの改行コードをLinux用の LF に変換できます。

■コマンド例(Windows(CRLF)→Linux(LF))

■(参考)コマンド例(Linux(LF)→Windows(CRLF))

■(参考)コマンドの存在確認

方法2: sed コマンド

sed で ^M を削除する方法もあります。

■オプション等の意味
・-i : 指定したファイルを直接編集(インプレース編集)します。要するに上書きされます。
s/\r//g
  s : substitute(置換)の指定です。
  /\r//\r(CR、^M)を””に変換(削除)します。
  g : global(全体)を対象とします。これがないと1つ目に一致したものだけ置換されます。

方法3: tr コマンド

tr を使ってもCR を削除できます。

 ^M 以外の制御文字

Linuxでは他にも ^ の表記を使った制御文字が表示されることがあります。

日本語名英語名略称ASCIIコード表記
ヌル(NULL)NullNUL0x00^@
ヘッダ開始Start of HeadingSOH0x01^A
テキスト開始Start of TextSTX0x02^B
テキスト終了End of TextETX0x03^C
伝送終了End of TransmissionEOT0x04^D
問い合わせEnquiryENQ0x05^E
肯定応答AcknowledgeACK0x06^F
ベル(警告音)BellBEL0x07^G
バックスペースBackspaceBS0x08^H
水平タブHorizontal TabHT0x09^I
改行Line FeedLF0x0A^J
垂直タブVertical TabVT0x0B^K
改ページ(フォームフィード)Form FeedFF0x0C^L
キャリッジリターン(復帰)Carriage ReturnCR0x0D^M
シフトアウトShift OutSO0x0E^N
シフトインShift InSI0x0F^O
データリンクエスケープData Link EscapeDLE0x10^P
装置制御1Device Control 1DC10x11^Q
装置制御2Device Control 2DC20x12^R
装置制御3Device Control 3DC30x13^S
装置制御4Device Control 4DC40x14^T
否定応答Negative AcknowledgeNAK0x15^U
同期アイドルSynchronous IdleSYN0x16^V
伝送ブロック終了End of Transmission BlockETB0x17^W
取消CancelCAN0x18^X
媒体終了End of MediumEM0x19^Y
置換SubstituteSUB0x1A^Z
エスケープEscapeESC0x1B^[
ファイル区切りFile SeparatorFS0x1C^\
グループ区切りGroup SeparatorGS0x1D^]
レコード区切りRecord SeparatorRS0x1E^^
ユニット区切りUnit SeparatorUS0x1F^_
削除DeleteDEL0x7F^?

コメント

タイトルとURLをコピーしました