テキストファイルで行末を見つける方法
私は解釈されるのではなく印刷されたファイルの行末を示すためにbashで何かを使用しようとしています。ファイルは、処理のためにLinuxマシンによって読み込まれているSSIS/SQL Serverからのダンプです。
vi
name__、less
name__、more
name__などの中にスイッチはありますか?改行コードを見ることに加えて、それがどんなタイプの改行コードであるかを知る必要があります(
CRLF
name__またはLF
name__)。どうやってそれを見つけるのですか?
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
すでに変換されたファイルを変換しても効果はないため、通常どおりの免責事項が適用されますが、盲目的に(つまり、最初にフォーマットをテストせずに)実行するのが安全です。
vi
nameで__...
行末を確認するには:set list
。
通常の状態に戻るには:set nolist
。
vi
name__の中で\n
や\r\n
を見ることはできないと思いますが、どの行末を持っているかを推測するためにそれがどのタイプのファイル(UNIX、DOSなど)かを見ることができます...
:set ff
あるいは、bash
name__からod -t c <filename>
または単にod -c <filename>
を使用して戻り値を表示することもできます。
Bashシェルでcat -v <filename>
を試してください。これはwindowsファイルのための復帰を表示するべきです。
(これはWindows XP上のCygwin経由でrxvtで私のために働いた)。
編集者注:cat -v
は\r
(CR)文字を視覚化したものです。 ^M
として。したがって、行末の\r\n
シーケンスは、各出力行の終わりに^M
として表示されます。 cat -e
は、\n
をさらに$
として視覚化します。 (cat -et
はさらにタブ文字を^I
として視覚化します。)
Ubuntu 14.04:
単純なcat -e <filename>
は問題なく動作します。
これは、UNIXの行末(\n
またはLF)を$
として、Windowsの行末(\r\n
またはCRLF)を^M$
として表示します。
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.
xxd
を使用してファイルの16進ダンプを表示し、 "0d0a"または "0a"の文字を探すことができます。
@warriorpostmanが示すように、cat -v <filename>
を使用できます。
"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の行末があります。
参考文献
man file
man dos2unix
- ウィキペディア: 改行
バイナリモードでファイルを編集するために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が新しい行で表示されます。
DOSの末尾に変換するにはtodos filename
を、UNIXの行末に変換するにはfromdos filename
を使用することができます。パッケージをUbuntuにインストールするには、Sudo apt-get install tofrodos
と入力します。
出力をテキストファイルにダンプします。それから私はメモ帳++でそれを開き、それからshow all charactersボタンをクリックします。それほどエレガントではありませんが、うまくいきます。