web-dev-qa-db-ja.com

テキストファイルで行末を見つける方法

私は解釈されるのではなく印刷されたファイルの行末を示すためにbashで何かを使用しようとしています。ファイルは、処理のためにLinuxマシンによって読み込まれているSSIS/SQL Serverからのダンプです。

  • viname__、lessname__、morename__などの中にスイッチはありますか?

  • 改行コードを見ることに加えて、それがどんなタイプの改行コードであるかを知る必要があります(CRLFname__またはLFname__)。どうやってそれを見つけるのですか?

240
Marco Ceppi

fileユーティリティを使用すると、行末の種類を知ることができます。

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"DOS":

$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators

"DOS"からUnixに変換するには:

$ dos2unix testfile2.txt

Unixから "DOS"に変換するには:

$ unix2dos testfile1.txt

すでに変換されたファイルを変換しても効果はないため、通常どおりの免責事項が適用されますが、盲目的に(つまり、最初にフォーマットをテストせずに)実行するのが安全です。

346

vinameで__...

行末を確認するには:set list

通常の状態に戻るには:set nolist

viname__の中で\n\r\nを見ることはできないと思いますが、どの行末を持っているかを推測するためにそれがどのタイプのファイル(UNIX、DOSなど)かを見ることができます...

:set ff

あるいは、bashname__からod -t c <filename>または単にod -c <filename>を使用して戻り値を表示することもできます。

120
Ryan Berger

Bashシェルでcat -v <filename>を試してください。これはwindowsファイルのための復帰を表示するべきです。

(これはWindows XP上のCygwin経由でrxvtで私のために働いた)。

編集者注:cat -v\r(CR)文字を視覚化したものです。 ^Mとして。したがって、行末の\r\nシーケンスは、各出力行の終わりに^Mとして表示されます。 cat -eは、\nをさらに$として視覚化します。 (cat -etはさらにタブ文字を^Iとして視覚化します。)

96
warriorpostman

Ubuntu 14.04:

単純なcat -e <filename>は問題なく動作します。

これは、UNIXの行末(\nまたはLF)を$として、Windowsの行末(\r\nまたはCRLF)を^M$として表示します。

86

CRを^Mとして表示するには、less -uを使用するか、次のように入力します。 -u もう少し開いています。

man lessは言う:

-u or --underline-special

      Causes backspaces and carriage returns to be treated  as  print-
      able  characters;  that  is,  they are sent to the terminal when
      they appear in the input.
13
P. Kucerak

xxdを使用してファイルの16進ダンプを表示し、 "0d0a"または "0a"の文字を探すことができます。

@warriorpostmanが示すように、cat -v <filename>を使用できます。

9
Rich

"file -k"を試してください。

私は時々PEM証明書ファイルのためにこれをチェックしなければなりません。

通常のfileの問題はこれです:時々それはあまりにも賢く/あまりにも具体的になろうとしています。

ちょっとクイズを試してみましょう:私はいくつかのファイルを持っています。そして、これらのファイルの1つは異なる行末を持っています。どれ?

(ところで:これが私の典型的な "証明書の仕事"ディレクトリのひとつです。)

通常のfileを試してみましょう。

$ file -- *
0.example.end.cer:         PEM certificate
0.example.end.key:         PEM RSA private key
1.example.int.cer:         PEM certificate
2.example.root.cer:        PEM certificate
example.opensslconfig.ini: ASCII text
example.req:               PEM certificate request

ええと。行末がわからない。そして私はすでにそれらが証明書ファイルであることを知っていました。そのことを伝えるのに「ファイル」は必要ありませんでした。

他に何を試すことができますか?

このようにdos2unixスイッチを付けて--infoを試すことができます。

$ dos2unix --info -- *
  37       0       0  no_bom    text    0.example.end.cer
   0      27       0  no_bom    text    0.example.end.key
   0      28       0  no_bom    text    1.example.int.cer
   0      25       0  no_bom    text    2.example.root.cer
   0      35       0  no_bom    text    example.opensslconfig.ini
   0      19       0  no_bom    text    example.req

つまり、 "yex、" 0.example.end.cer "は変わった男でなければなりません。しかし、どんな種類の行末がありますか? あなたはdos2unixの出力フォーマットを心から知っていますか? (私はしません)

しかし幸いなことにfileには--keep-going(または略して-k)オプションがあります。

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data

優秀な!これで、奇妙なファイルにDOS(CRLF)の行末があることがわかりました。 (そして他のファイルはUnix(LF)の行末を持ちます。これはこの出力では明示的ではありません。それは暗黙的です。fileが「通常の」テキストファイルを期待する方法です。)

(私のニーモニックを共有したい場合は、 "L"は "Linux"用、 "LF"用です。)

それでは犯人を変換してやり直しましょう。

$ dos2unix -- 0.example.end.cer

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data  

良い。現在すべての証明書にはUnixの行末があります。

参考文献

7
StackzOfZtuff

バイナリモードでファイルを編集するためにvim -b filenameを使用することができます、そしてそれはキャリッジリターンのための^ M文字を示します、そして、新しい行はWindows CRLF行末を示すLFがあることを示します。 LFとは\nを意味し、CRとは\rを意味します。 -bオプションを使用すると、ステータス行の[unix]で示されているように、ファイルは常にデフォルトでUNIXモードで編集されます。つまり、新しい行を追加すると、CRLFではなくLFで終わります。 CRLFの行末を持つファイルに対して通常のvimを-bなしで使用すると、ステータス行に[dos]が表示され、挿入された行に行末としてCRLFが表示されます。 fileformats設定のためのvim文書は複雑さを説明しています。

また、Notepad ++の解答についてコメントするのに十分なポイントはありませんが、WindowsでNotepad ++を使用している場合は、View/Show Symbol/Show End of Lineメニューを使用してCRとLFを表示します。この場合LFが表示されますが、vimの場合はLFが新しい行で表示されます。

4
smalers

DOSの末尾に変換するにはtodos filenameを、UNIXの行末に変換するにはfromdos filenameを使用することができます。パッケージをUbuntuにインストールするには、Sudo apt-get install tofrodosと入力します。

4
Zorayr

出力をテキストファイルにダンプします。それから私はメモ帳++でそれを開き、それからshow all charactersボタンをクリックします。それほどエレガントではありませんが、うまくいきます。

0
Diego