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


304

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

  • 内の任意のスイッチがありvilessmore、などが?

  • 行末を確認するだけでなく、行末の種類を知る必要があります(CRLFまたはLF)。どうやってそれを見つけるのですか?


1
一般的なヒント:どの* nix / cygwinコマンドを使用できるかがわかれば、いつでもそのマンページを表示して、必要な機能を提供できるスイッチを検索できます。例えば、man less
David Rivers

回答:


421

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

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


9
これらは、それぞれ「fromdos」と「todos」と呼ばれることもあります(Ubuntu 10.4以降の場合と同様)
Jess Chadwick

3
@JessChadwick:はい、しかし、あなたが明示的にインストールしている場合のみtofrodosで、パッケージをsudo apt-get install tofrodos-あなたが実行する必要があるだろうと同じようにsudo apt-get install dos2unix取得するdos2unixunix2dos
mklement0

Actully DOS2UNIXは、すべての作業を行うことができない、私は考えてstackoverflow.com/questions/23828554/dos2unix-doesnt-convert-mが最良の答えを与える
ネイサン

@nathan:何んdos2unixで失敗?その質問のOPは問題を漠然と説明しているだけです。
追って通知があるまで一時停止。

@DennisWilliamson fileコマンドの前と後のdos2unixコマンドは同じ出力を取得しました:xxx.c Cソース、ASCIIテキスト、CR、LF行ターミネーター。このcファイルの行の中央に^ Mが含まれていることがわかりました。これはxxxxxxx ^ M xxxxxxxのようです
nathan

127

vi...

:set list 行末を確認します。

:set nolist 通常に戻ります。

\nまたは\r\nで表示できないと思いますがvi、ファイルの種類(UNIX、DOSなど)を確認して、行末を推測できます...

:set ff

または、から、または単に返品を表示bashするために使用できます。od -t c <filename>od -c <filename>


26
残念ながら、viがこれらの特定の文字を表示できないと思います。od -c <filename>を試すと、\ nまたは\ r \ nが表示されると思います。
Ryan Berger

3
「その価値がある」カテゴリでは、grep --regex = "^ M"を発行してDosスタイルのCRLFをgrepできます。ここで、^ MはCTRL + V CTRL + Mです。それらをsedコマンドで置き換えることで削除できます。これは本質的にdos2unixと同じことを行います
カウボーイダン

11
vimの場合:ファイルの行末:set fileformatunixどちらであるとdosvimが判断したかを報告します。これはで変更できます:set fileformat=unix
ビクターザマニアン2013年

5
vi / vimの起動時に-bフラグを使用し、次に:set listを使用してCR(^ M)およびLF($)の末尾を確認します。
サミュエル

1
@RyanBerger--tがないようです。はずですがod -t c file/path、新しいプログラムに感謝します。よくできました!
Eric Fossum 2016

113

Ubuntu 14.04:

単純なcat -e <filename>作業でも問題ありません。

これにより、Unixの行末(\nまたはLF)として$、Windowsの\r\n行末(またはCRLF)としてが表示され^M$ます。


7
OSXでも動作します。良い解決策。単純で、私にとってはうまくいきましたが、受け入れられた答えはそうではありませんでした。(注:.txtファイルではありませんでした)
dlsso

4
M $の表示はeasteregg / windows bashingですか?
トムM

Solarisでは動作しませんが、動作するはずだったと男性は言う
Zeus

101

bashシェルで、を試してくださいcat -v <filename>。これにより、Windowsファイルの改行が表示されます。

(これはWindows XPのCygwinを介してrxvtで私のために働きました)。

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


3
@ChrisK:試してみるecho -e 'abc\ndef\r\n' | cat -v^M、「def」の後にaが表示されるはずです。
追って通知があるまで一時停止。

ファイルに^ M(Windows / DOS EOL)が含まれているかどうかを確認したかったので、cat -vだけでそれが表示されました。そのための+1
Ali

1
^ M = DOS / Windowsスタイル
Mercury

修正:したがって、行末の\ r \ nシーケンスは^ M $として表示されます
Shayan

19

^M使用頻度の低いCRを表示するless -u-u、lessが開いているときに入力します。

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.

1
あなたの答えを明確にしてください。
adao7000 2015

12

試してみてくださいfileそして、file -kその後、dos2unix -ih

file通常は十分です。しかし、タフな場合は、file -kまたはを試してくださいdosunix -ih

詳細は以下。


試す file -k

ショートバージョン: file -k somefile.txt教えてくれます。

  • with CRLF line endingsDOS / Windowsの行末に出力されます。
  • with LF line endingsMAC行末に出力されます。
  • Linux / Unix行「CR」の場合は、単に出力されますtext。(そのため、明示的に言及していない場合line endings、これは暗黙的に「CR行末」を意味します。)

ロングバージョンは以下をご覧ください。


実際の例:証明書のエンコード

PEM証明書ファイルを確認する必要がある場合があります。

レギュラーの問題fileはこれです:時々それはあまりにもスマート/あまりに特定しようとしています。

少しクイズに挑戦してみましょう。いくつかのファイルがあります。そして、これらのファイルの1つは異なる行末を持っています。どれ?

(ちなみに、これは私の典型的な「証明書作業」ディレクトリの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

つまり、「0.example.end.cer」は奇妙な男であるに違いありません。しかし、どのような行末がありますか?dos2unix出力フォーマットを暗記していますか?(私はしません。)

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

$ 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の行末があります。

試す dos2unix -ih

上記の例を書いているとき、私はこれを知りませんでした:

実際、次のように-ih(の略--info=h)を使用すると、dos2unixがヘッダー行を提供することがわかります。

$ dos2unix -ih -- *
 DOS    UNIX     MAC  BOM       TXTBIN  FILE
   0      37       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

そしてもう1つの「実際の」瞬間:ヘッダーのフォーマットは本当に覚えやすいです:ここに2つのニーモニックがあります:

  1. これはDUMBです(左から右:dはDos、uはUnix、mはMac、bはBOM)。
  2. また、「DUM」はD、U、Mのアルファベット順です。

参考文献


1
次のような出力が生成されます:Accounts.java: Java source, ASCII text\012-WindowsのMinTTY
スタンドアロンで

@standalone:興味深い。私は "igncr"と呼ばれるオプションについての奇妙なことを読みました-あなたが言っていることはそのように聞こえます。しかし、あなたが説明したものを再現することはできません。(Git-for-Windowsに付属しているminttyのBash内で「gitバージョン2.24.0.windows.1」を試しました。)
StackzOfZtuff

うーん、file -k Accounts.javagit-for-windowsに付属のminttyも試してみましたが、私のバージョンはgit version 2.21.0.windows.1
スタンドアロンで

私にとっての解決策はcat -e file_to_test
スタンドアロンで

9

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

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


1
それは猫v 8.23で私のために動作します。Unixの行末は追加情報を出力しませんが、DOSの行末は「^ M」を出力します。
リッチ

UNIXの行末を使用しているという事実を考えると、これは8.21で実行していることです。
neanderslob 2015年

5

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


5

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

また、Notepad ++の回答についてコメントするのに十分なポイントはありませんが、WindowsでNotepad ++を使用している場合は、[表示]、[記号の表示]、[行末の表示]メニューを使用してCRとLFを表示します。この場合、LFが表示されますが、vimの場合、LFは新しい行で示されます。


0

出力をテキストファイルにダンプします。次に、メモ帳++で開き、[すべての文字を表示]ボタンをクリックします。あまりエレガントではありませんが、機能します。


3
この質問にはLinuxのタグが付けられていますが、notepad ++はLinux用ではないと思います。これはWindowsでも機能するはずです。
リック・スミス

0

Vim-常にWindowsの改行を ^M

vimでWindowsの改行を常に表示したい^M場合は、この行を次の行に追加できます.vimrc

set ffs=unix

これにより、vimは、開いているすべてのファイルをUNIXファイルとして解釈します。unixファイルには\n改行文字が含まれているため、の改行文字を含むWindowsファイル\r\nは引き続き正常にレンダリングされますが(のおかげで\n^M、ファイルの最後にあります(vimが\r文字をレンダリングする方法です)。


Vim-Windowsの改行を表示することがある

ファイルごとに設定したい場合は:e ++ff=unix、特定のファイルを編集するときに使用できます。


Vim-常にファイルタイプを表示(unixvs dos

vimの一番下の行に編集中のファイルタイプを常に表示させたい場合(そしてファイルタイプをunixに強制的に設定しなかった場合)、statuslinewithをに追加できます
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}

私の完全なステータスラインを以下に示します。に追加するだけ.vimrcです。

" Make statusline stay, otherwise alerts will hide it
set laststatus=2
set statusline=
set statusline+=%#PmenuSel#
set statusline+=%#LineNr#
" This says 'show filename and parent dir'
set statusline+=%{expand('%:p:h:t')}/%t
" This says 'show filename as would be read from the cwd'
" set statusline+=\ %f
set statusline+=%m\
set statusline+=%=
set statusline+=%#CursorColumn#
set statusline+=\ %y
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\[%{&fileformat}\]
set statusline+=\ %p%%
set statusline+=\ %l:%c
set statusline+=\ 

それはのようにレンダリングされます

.vim/vimrc\                                    [vim] utf-8[unix] 77% 315:6

ファイルの下部


Vim-ファイルタイプを表示する(unixvs dos

あなたが持っているファイルのタイプを見たいだけなら、あなたは使うことができます:set fileformat(これはファイルタイプを強制的に設定した場合には機能しません)。unixUNIXファイルおよびdosWindowsの場合に戻ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.