私のターミナルでキャリッジリターン( `\ 0D`)を解釈しないでください。

私のターミナルでキャリッジリターン( `\ 0D`)を解釈しないでください。

grep大容量のテキストファイルで特定の表現を使用する必要があることがよくあります。何らかの理由で、個人プロバイダはテキストファイルの特定の行からパラメータを区切るためにCR(キャリッジリターン、)を使用することにしました。\0D

ただし、このCR文字は端末で解釈されるため、mygrepまたはcatコマンドがほとんど役に立たなくなります。

では、端末に次のファイル(たとえば)の内容をどのように表示できますかxterm-256color

$ hexdump /tmp/bla 
0000000 3031 3030 3020 0d20 3335 310d 3132 3830
0000010 300d 302e 3031 3030 0d30 0a33          
000001c

今まで試してみましたが運がありませんでした。

$ TERM=dumb cat /tmp/bla 
3.010000

答え1

GNU catには、これらの特殊文字を含むファイルを印刷するのに役立ついくつかのオプションがあります。

   -v, --show-nonprinting
          use ^ and M- notation, except for LFD and TAB

したがって、cat -v /tmp/blaこれはあなたの状況に従って行われるべきです。あるいは-et、特別な方法でタブと行末を印刷することもできます。

答え2

より便利なのは、データが16進数で、0xdがキャリッジリターン(\rまたは^M)であることを識別することです。この問題を解決する方法はいくつかあります。

  • 質問によると特定の行そして、ダンプを見ると、script誰かがファイル編集を変更した可能性があります。この場合、編集変更の最終結果を1行にすべて取得したい場合があります。使用できるcolこの目的のために、例えば

    col /tmp/bla

    col想像ほど強力ではないが。 (私はvi-like-emacsのマニュアルページフィルタに基づくスクリプトを使用していますいいね結果 - 私の返信に簡単なスクリプトを作成しました。Unixユーティリティを使用してプログラムでANSI制御コードをファイルに「書き込み」できますか?)よりも便利ですcol

  • その後、OPはこれを複数行で処理したいと思います。これを行うには、次のようにします(キャリッジリターンを改行に変換)。

    tr '\r' '\n' </tmp/bla

しかし、キャリッジリターンはエスケープシーケンスではありません。どのオプションで、Cスタイルの「エスケープ」形式で表示される文字)。

関連情報