web-dev-qa-db-ja.com

LinuxでCRLFを改行に変換する

Linuxで[〜#〜] crlf [〜#〜]をファイル内の改行に変換する最良の方法は何ですか?

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

34
JoelFan

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

fromdos yourtextfile

逆に:

todos yourtextfile

これらのコマンドはtofrodosパッケージ(最新のディストリビューション)にあり、2つのラッパーunix2dosおよびdos2unix同じ名前の古いUNIXツールを模倣しています。

42
avelldiroll

dos2unix

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

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

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

私は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を削除するよりも少し複雑ですbeefインタープリター(フレンドリーな近所のDebianリポジトリにあります)、

dos2unix inbrainfuck

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

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

21
quack quixote

私はこれを Bash で行います:

cat cr_stuffed.file | tr -d \r > no_more_crs.file
9
JustJeff

tr も使用できると思います(試してみる面白いフォーマットファイルはありません)。

tr -d '\r' < file1 > file2
7
warren

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

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

4
Stefan Sjöberg

In viまたは Vim

:%s/^V^M//g
4
fpmurphy

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

3
opello

これを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 LFからLFawkを使用:

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(inputr ecord s eparator)を\r?\nに設定し、入力が読み取られることを意味しますLF(\n)で区切られた行ごとの行(?)の前にCR(\r)を付けることができます。

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


LF to CR LF:変数ORSを設定できます(outputr ecord s eparator)出力の行末を変更します。例:

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

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

編集:または、単にUnix形式に変換する場合は、メニューオプションTools> End of Line> Unixを使用します。

1
DisgruntledGoat

正規表現でPerlの一般的な\Rを使用します。そうすれば、CR、CRLF、またはすでにLFまたはそれらの組み合わせでファイルを変換できます(そう、2つの異なる改行規則が混在するファイルがあります!)。

Perl -i.bak -pe 's/\R/\n/g' $yourfile

-i.bakは、ファイルを元の場所に変換し、元のファイルを${yourfile}.bakとして保存するようにPerlに指示します)

\Rの詳細 この答え

1
mivk

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

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

find . -type f

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

xargs file

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

grep CRLF

CRLFを示す file の出力のみが必要です。

cut -d: -f1

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

xargs dos2unix

ファイル名をプログラムに渡します dos2unixxargs を使用します。

0
Tschallacka