LinuxでCRLFを改行に変換する


34

Linux上のファイルでCRLFを改行に変換する最良の方法は何ですか?

sedコマンドを見てきましたが、もっと簡単なものはありますか?


4
デュープ:superuser.com/questions/38744/...を。受け入れられた回答で提供されるリンクは、特にdos2unix、perl、およびviオプションをカバーしています。
nagul

2
(これらのいずれかが閉じられるそうならば、それはおそらく1つでなければなりません)が、これはすでに、より良い答えを持っている
Jonik

回答:


40

次のコマンドを使用します。

fromdos yourtextfile

逆に:

todos yourtextfile

これらのコマンドはtofrodosパッケージ(最新のディストリビューション)にあり、同名の古いUNIXツールを模倣する2つのラッパーunix2dosdos2unixも提供します。


2
+1現在トップ投票されている「Use dos2unix」の回答よりもはるかに便利です。
ジョニック

1
ええ、私もこれを投票しています。私のほうはドライブバイの提案でした。
ライアントンプソン

あなたがそれを再帰的にする方法を言ったら私は余分なボーナスを与えるでしょう。現在、ワイルドカードでのみ動作します。
ソリン

2
@SorinSbarnea:次のようなものfind . -name '*.txt' -print0 | xargs -null fromdos
-bstpierre

@Jonikが「はるかに便利」にする理由は何ですか?深刻な質問
アンドリューウェーバー

24

を使用しdos2unixます。

dos2unix-DOS / MACからUNIXへのテキストファイル形式コンバーター

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]

2
そしてunix2dosが他の方法で 'ラウンド。
いんちきのキホーテ2009年

いんちき、あなたは私をフォローしていますか?すべての賛成票で、私はそれを感謝していないわけではありません。
ライアントンプソン

1
男、私は〜クワックです。「〜」を「not」と発音します。:)しかし、いいえ、あなたをフォローしていません、私は頻繁にあなたに遭遇するように見えます。
いんちきキホーテ

1
Linuxシステムでこのユーティリティを入手する方法について詳しく検討してください。少なくともUbuntuでは、デフォルトではインストールされません(ただし、tofrodosパッケージをインストールすると、packages.ubuntu.com / jaunty / tofrodosに非常に似たものが得られます)。
ジョニック

20

私はperlを好む:

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt

しかし、それは私の用途によく合い、覚えるのはとても簡単です。すべてのシステムにdos2unixコマンドがあるわけではありませんが、私が取り組んでいるほとんどのシステムにはperlインタープリターがあります。

もう1つはrecodeで、dos2unixとiconvの強力な代替品です。Debianリポジトリの「recode」パッケージで入手できます。

recode ibmpc..lat1 winfile.txt   # dos2unix
recode lat1..ibmpc unixfile.txt  # unix2dos

以下のためのawkのファン:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

...およびsed

sed 's/\r$//' winfile.txt > unixfile.txt

そして今、stackoverflow.comの友人の1人から直接16進エディターでCRを手動で削除するよりも少し複雑さが少なく、ビーフインタープリター(使いやすい近所のDebianリポジトリにあります)で使用できます。

dos2unix in brainfuck

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

これを書くために彼の人生の1時間を無駄にしてくれたjkに大いに感謝します!


1
(猫の無駄な使用)perlはsedと同じくらい複雑です...したがって、あなたは本当に質問に答えているのではなく、むしろ評判を集めているのです:)
akira

2
「最良の方法」は主観的です。これは私に最適です(私はsedよりもperlの方が快適です)。私はそれがあなたに最適だとは約束しませんでした。
いんちきキホーテ2009年

@akira:質問には複数の有効な回答を含めることができます。私もこの方法を時々使用しますが、ほとんどの場合、他の変更と組み合わせて使用​​するため、間違いなく有効な答えです。ただし、ほとんどの場合、「use dos2unix」が間違いなくより実用的な答えです。だから私は格付けは大丈夫だと思う。
reinierpost

@akira:より簡単な場合は、回答として投稿し、他の人に啓発してください。
いんちきのキホーテ

@〜quack:それがポイントです:単純ではありません。あなたのperlの答えも同じです。u2dまたはfromdos / todosは、他のプログラミング言語で表現されるものより単純であるため、正しい答えです。
アキラ


7

を使用することもできると思いますtr(ただし、試してみるのに面白い形式のファイルはありません)。

tr -d '\r' < file1 > file2


4

非常に簡単な方法を見つけました…nanoでファイルを開く:## nano file.txt

Ctrl + Oを押して保存しますが、Enterを押す前に、Alt + DでDOSとUnix / Linuxの行末を切り替えるか、Alt + MでMacとUnix / Linuxの行末を切り替えてからEnterを押して保存し、 Ctrl + Xで終了します。


1
回答を編集して、OPによって要求された動作をどのトグル設定が再現するかを明確にできますか?
ブルギ

OPは切り替えたいオフので、DOSの行末をAlt+d。時々、altは端末プログラムによってインターセプトされるため、esc+d代わりに使用できます。
スピンアップ

1
多くのnanoショートカットはShiftキーを押した状態でも機能します。これにより、端末のインターセプトが妨げられることが多いため、「Alt-Shift-D」も機能します。
mwfearnley

3

私が好むVimをして:set fileformat=unix。最速ではありませんが、プレビューが表示されます。末尾が混在しているファイルの場合に特に便利です。


1

GUIメソッドが必要な場合は、Kateテキストエディターを試してください(他の高度なテキストエディターでもこれを処理できる場合があります)。開き見つける / 置き換えダイアログ(Ctrl+をR)、と交換してください\r\n\n。(注:ドロップダウンから「正規表現」を選択し、オプションから「選択のみ」の選択を解除する必要があります。)

EDIT:または、あなたは、単にUnixのフォーマットに変換したい場合は、メニューオプションを使用しますTools> End of Line> Unix


これらの変換を自動的に実行できるjEditなどのテキストエディターがあります。Unix、Windows、またはMacの行区切り文字が必要かどうかを伝えるだけです。
ジョニック

実際、KATEは[ツール]> [行の終わり ]メニューからも実行できます。たぶん、言葉どおりに質問に答えるよりも横方向に考えるべきだったかもしれませんが、具体的に変換\r\nしたい\n場合は、どのOSがどの行末を使用しているかを覚えるよりも検索/置換を使用する方が簡単です。;)
DisgruntledGoat

1

これをdos2unix.py Pythonスクリプトに貼り付けます。

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

Pythonがインストールされているすべてのプラットフォームで動作するはずです。パブリックドメイン。


1

CR LFawkLF使用する場合:

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

使用例:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

説明:

-v RS='\r?\n'変数RS(設定入力 のR ECORD S eparator)への\r?\n入力は、LF(によって分離されたライン毎に読み取られる意味、\n(できる)?)CR(が先行します\r)。

1awkが実行するスクリプトです。スクリプトはで構成されcondition { action }ます。この場合、1trueと評価される条件です。アクションは省略されているため、デフォルトのアクションが実行されます。これは、現在の行を印刷することを意味します{print $0}またはとして記述することもできます{print})。


LFto CR LF:変数ORSo utput r ecord s eparator)を設定して、出力行末を変更できます。例:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C

0

WindowsシステムからUnixシステムにファイルを緊急転送するために必要なファイルにこのスクリプトを使用しました。

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

コマンドを実行しているディレクトリで再帰的にすべてのファイルを検索します

xargs file

これをファイルプログラムに渡して、ファイルの分析を取得します。

grep CRLF

CRLFを示すファイルの出力のみが必要です。

cut -d: -f1

色までの出力を取得します。残りを捨てます。今はファイル名だけが必要です

xargs dos2unix

xargsを使用して、ファイルdos2unixにファイル名を渡します。

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