ログファイルから^ M文字を削除します。
スクリプトでは、プログラムの出力をログファイルにリダイレクトします。ログファイルの出力に、^ M(改行)文字が含まれています。実行中に削除する必要があります。
私のコマンド:
$ Java -jar test.jar >> test.log
test.log
には以下があります。
開始スクリプト... ^ M開始スクリプト...初期化中
次のコマンドを実行すると、
$ dos2unix <file>
<file>
では、すべての^ M文字が削除されます。 <file>
をそのまま残したい場合は、次のようにdos2unix
を実行します。
$ dos2unix -n <file> <newfile>
パイプを介して一連のコマンドの一部としてそれらを実行する必要がある場合は、tr
、sed
、awk
、またはPerl
などのツールをいくつでも使用できます。
tr
$ Java -jar test.jar | tr -d '^M' >> test.log
sed
$ Java -jar test.jar | sed 's/^M//g' >> test.log
awk
$ Java -jar test.jar | awk 'sub(/^M/,"")' >> test.log
Perl
$ Java -jar test.jar | Perl -p -e 's/^M//g' >> test.log
^M
を入力するときは、次のいずれかの方法で入力してください。
\r
)として。\015
)として。\x0D
)。^M
は、Windowsプラットフォームでの行末の終端方法の一部です。行の各終わりは、復帰文字とそれに続く改行文字で終了します。
Unixシステムでは、行末は改行文字だけで終了します。
0x0A
(16進数)。\n
とも表記されます。0x0D
(16進数)、\r
とも表記。これらの出力は、od
やhexdump
などのツールにパイプで出力すると確認できます。次に、改行キャリッジリターン+ラインフィード文字を含むサンプルファイルを示します。
$ cat sample.txt
hi there
bye there
\r
+ \n
として、hexdump
でそれらを表示できます。
$ hexdump -c sample.txt
0000000 h i t h e r e \r \n b y e t h
0000010 e r e \r \n
0000015
または、16進数として0d
+ 0a
:
$ hexdump -C sample.txt
00000000 68 69 20 74 68 65 72 65 0d 0a 62 79 65 20 74 68 |hi there..bye th|
00000010 65 72 65 0d 0a |ere..|
00000015
これをsed 's/\r//g'
で実行:
$ sed 's/\r//g' sample.txt |hexdump -C
00000000 68 69 20 74 68 65 72 65 0a 62 79 65 20 74 68 65 |hi there.bye the|
00000010 72 65 0a |re.|
00000013
sed
が0d
文字を削除したことがわかります。
はい、vim
を使用してこれを行うことができます。上記のようにファイルを変換する効果を持つvimでfileformat
設定を設定するか、vim
ビューでファイル形式を変更できます。
ファイルの形式の変更
:set fileformat=dos
:set fileformat=unix
省略表記も使用できます。
:set ff=dos
:set ff=unix
または、ビューのファイル形式を変更することもできます。このアプローチは非破壊的です。
:e ++ff=dos
:e ++ff=unix
ここで、vim
の^M
ファイルsample.txt
を開いているところを確認できます。
今、私はビューでファイル形式を変換しています:
unix
ファイル形式に変換すると、次のようになります。
dos2unix
を介してファイルを移動し、行末を修正します。
または、次のいずれかを使用します。
sed 's,\r$,,'
tr -d '\r'
isatty()
を呼び出すようにプログラムを修正する必要があります。stdoutがttyでない場合は、^ Mを出力しないでください。
特別な標識なしの^ Mの削除:
$ tr -d '\015' <file1 >file2
$ mv file2 file1