回答:
tr
DOSからUnixへの変換に使用できます。ただし、CRがファイルにCRLFバイトペアの最初のバイトとしてのみ表示される場合にのみ、これを安全に行うことができます。これは通常のケースです。次に使用します:
tr -d '\015' <DOS-file >UNIX-file
名前DOS-file
は名前とは異なることに注意してくださいUNIX-file
。同じ名前を2回使用しようとすると、ファイルにデータがなくなります。
他の方法でそれを行うことはできません(標準の 'tr'を使用)。
あなたがスクリプトにキャリッジリターンを入力する方法を知っていれば(control-V、control-Mその後、制御-Mを入力します):
sed 's/^M$//' # DOS to Unix
sed 's/$/^M/' # Unix to DOS
ここで、「^ M」はコントロールM文字です。bash
ANSI-C引用メカニズムを使用して、復帰を指定することもできます。
sed $'s/\r$//' # DOS to Unix
sed $'s/$/\r/' # Unix to DOS
あなたは非常に頻繁にこれを実行する必要があるとしている場合は、(複数回、大まかに言えば)、変換プログラムをインストールするには、はるかに賢明である(例えばdos2unix
、およびunix2dos
、またはおそらくdtou
とutod
)とそれらを使用しています。
ディレクトリとサブディレクトリ全体を処理する必要がある場合は、次を使用できますzip
。
zip -r -ll zipfile.zip somedir/
unzip zipfile.zip
これにより、行末がCRLFからCRに変更されたzipアーカイブが作成されます。unzip
次に、変換されたファイルを元の場所に戻します(ファイルごとに尋ねます-答えは「はい」から「すべて」)。これを指摘してくれた@vmsnomadの功績。
tr -d '\015' <DOS-file >UNIX-file
where DOS-file
== を使用するUNIX-file
と、空のファイルになります。残念ながら、出力ファイルは別のファイルでなければなりません。
sed
オプション-i
(インプレース用)が機能します。制限はリンクされたファイルとシンボリックリンクです。sort
コマンドはいつも'(1979年以来、そうでない場合は、以前の)サポートしてきた-o
入力ファイルのいずれかを一覧表示することができますオプションを選択します。ただし、sort
出力を書き込む前にすべての入力を読み取る必要があるためです。他のプログラムは、入力ファイルの1つを上書きすることを散発的にサポートします。Kernighan&Pikeによる「UNIXプログラミング環境」で問題を回避するための汎用プログラム(スクリプト)を見つけることができます。
sed -i $'s/\r$//' filename
- その 場で編集します。インターネットにアクセスできないマシンで作業しているため、ソフトウェアのインストールに問題があります。
tr -d "\r" < file
# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//' # assumes that all lines end with CR/LF
sed 's/^M$//' # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//' # works on ssed, gsed 3.02.80 or higher
# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/" # command line under ksh
sed 's/$'"/`echo \\\r`/" # command line under bash
sed "s/$/`echo \\\r`/" # command line under zsh
sed 's/$/\r/' # gsed 3.02.80 or higher
sed -i
インプレース変換などに使用しsed -i 's/..../' file
ます。
\r
:tr "\r" "\n" < infile > outfile
-d
はより頻繁に取り上げられ、「唯一の\r
」状況では役に立ちません。
\r
れた\n
マッピングにはファイルのダブルスペースの効果があることに注意してください。DOSで終わる各CRLF行\n\n
はUnixになります。
POSIXでこれを行うのは注意が必要です。
POSIX Sedは\r
またはをサポートしていません\15
。たとえあったとしても、その場でのオプション-i
はPOSIXではありません
POSIX Awkは\r
およびをサポートし\15
てい-i inplace
ますが、オプションはPOSIXではありません
d2uとdos2unixはPOSIXユーティリティではありませんが、exは
POSIX exはサポートしていない\r
、\15
、\n
または\12
改行を削除するには:
ex -bsc '%!awk "{sub(/\r/,\"\")}1"' -cx file
改行を追加するには:
ex -bsc '%!awk "{sub(/$/,\"\r\")}1"' -cx file
tr
サポートしている\r
ようです。 したがってprintf '%s\n' '%!tr -d "\r"' x | ex file
、使用することもできます(当然ですが、\r
直前のでなくても削除され\n
ます)。また、-b
オプションex
はPOSIXでは指定されていません。
オプション-c {command}を使用してプログラムでvimを使用できます。
UnixへのDos:
vim file.txt -c "set ff=unix" -c ":wq"
Unixからdos:
vim file.txt -c "set ff=dos" -c ":wq"
「set ff = unix / dos」は、ファイルのファイル形式(ff)をUnix / DOSの行末形式に変更することを意味します
":wq"は、ファイルをディスクに書き込み、エディターを終了します(ループでコマンドを使用できます)
vi
する人は誰でもその:wq
意味を知っています。3文字でない場合、1)viコマンド領域を開く、2)書き込む、3)終了するという意味です。
AWKを使用すると、次のことができます。
awk '{ sub("\r$", ""); print }' dos.txt > unix.txt
Perlを使用すると、次のことができます。
perl -pe 's/\r$//' < dos.txt > unix.txt
awk
ソリューション。
ファイルをその場で変換するには
dos2unix <filename>
変換されたテキストを別のファイルに出力するには
dos2unix -n <input-file> <output-file>
UbuntuまたはDebianにインストールできます
sudo apt install dos2unix
またはmacbでhomebrewを使用
brew install dos2unix
この問題は標準ツールで解決できますflip
が、20年以上前にの作者であるRahul Dhesiが作成したコマンドをインストールすることをお勧めしますzoo
。たとえば、バイナリファイルの不注意による破壊を回避しながら、ファイル形式を変換する優れた仕事をします。これは、目にするすべてのCRLFの変更に取り掛かるだけでは少し簡単です...
これまでに投稿された解決策は問題の一部のみを扱い、DOS / WindowsのCRLFをUnixのLFに変換します。欠けているのは、DOSがCRLFを行区切り文字として使用するのに対し、UnixはLFを行終了文字として使用することです。違いは、DOSファイル(通常)はファイルの最後の行の後に何もないことですが、Unixにはあります。正しく変換するには、その最後のLFを追加する必要があります(ファイルの長さがゼロでない場合、つまりファイルに行がない場合を除きます)。これに対する私のお気に入りの呪文(Mac形式のCRで区切られたファイルを処理するためのロジックが少し追加され、すでにUNIX形式の痴漢ファイルではない)は少しperlです。
perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt
これにより、Unix化されたバージョンのファイルがstdoutに送信されることに注意してください。ファイルをUnix化されたバージョンに置き換える場合は、perlの-i
フラグを追加します。
dos2unixにアクセスできないが、このページを読むことができる場合は、ここからdos2unix.pyをコピーして貼り付けることができます。
#!/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))
スーパーユーザーからのクロスポスト。
dos2unix
変換します。使用法はパラメータを意味します。そして本当のは、ファイルが与えられない場合、標準入力から読み取り、標準出力に書き込むフィルターです。-n
dos2unix
PCREで簡単にスーパーデューパー。
スクリプトとして、または$@
ファイルに置き換えます。
#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@
これでファイルが上書きされます!
これはバックアップ(バージョン管理など)でのみ行うことをお勧めします
--
。このソリューションを選択した理由は、理解しやすく、自分に適応しやすいからです。参考までに、これはスイッチの機能です。-p
「while入力」ループを想定し、-i
入力ファイルを編集して、-e
次のコマンドを実行します
プログラムなしのさらに単純なawkソリューション:
awk -v ORS='\r\n' '1' unix.txt > dos.txt
技術的には「1」はプログラムです。b/ c awkはオプションが指定されたときに1つ必要です。
更新:このページを久しぶりに再訪した後、内部ソリューションをまだ誰も投稿していないことに気づきました。
while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.txt > unix.txt
awk -v RS='\r\n' '1' dos.txt > unix.txt
awk
やsed
ソリューションよりもはるかに低速です。また、を使用while IFS= read -r line
して入力行を忠実に保存する必要があります。そうしないと、先頭と末尾の空白が削除されます(または、read
コマンドで変数名を使用せずにを使用します$REPLY
)。
おもしろいことに、私のgit-bashのWindows sed ""
では、既にトリックが行われています。
$ echo -e "abc\r" >tst.txt
$ file tst.txt
tst.txt: ASCII text, with CRLF line terminators
$ sed -i "" tst.txt
$ file tst.txt
tst.txt: ASCII text
私の推測では、sedは入力から行を読み取るときにそれらを無視し、常に出力にUNIXの行末を書き込みます。
同じ質問を熟考する必要がありました(Windows側ですが、Linuxにも同様に当てはまります)。驚いたことに、古き良きzip -ll
オプション(Info-ZIP)を使用してテキストファイルのCRLF <-> LF変換を行う非常に自動化された方法については誰も言及していません。
zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip
注:これにより、元のファイル名を保持しながら、行末をLFに変換するzipファイルが作成されます。次にunzip
、zipされたファイル、つまり元の名前(ただしLFで終わるファイル)を抽出し、ローカルの元のファイルがある場合は上書きするように求めます。
からの関連抜粋zip --help
:
zip --help
...
-l convert LF to CR LF (-ll CR LF to LF)
Mac OSXの場合、homebrewがインストールされている場合[ http://brew.sh/][1]
brew install dos2unix
for csv in *.csv; do dos2unix -c mac ${csv}; done;
このコマンドはファイルを適切に変更するため、ファイルのコピーを作成したことを確認してください。-c macオプションは、スイッチをosxと互換性があるようにします。
-c mac
。これは、OS X CR
以前のみの改行を変換するためのものです。このモードは、Mac OS 9以前との間のファイルにのみ使用します。
Linuxでは、sedを使用して^ M(ctrl-M)を* nix改行(^ J)に変換するのは簡単です。
CLIでは次のようになります。実際にはテキストに改行があります。ただし、\は^ Jをsedに渡します。
sed 's/^M/\
/g' < ffmpeg.log > new.log
入力するには、^ V(Ctrl-V)、^ M(Ctrl-M)、および\(バックスラッシュ)を使用してこれを取得します。
sed 's/^V^M/\^V^J/g' < ffmpeg.log > new.log
sed --expression='s/\r\n/\n/g'
質問はsedについて言及しているため、これはsedを使用してこれを達成する最も簡単な方法です。この表現では、キャリッジリターンとラインフィードをすべてラインフィードのみに置き換えています。これは、WindowsからUnixに移行するときに必要です。動作することを確認しました。
OSXおよび他のいくつかの方法でsed 's / ^ M $ //' file.txtを試しました(http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- dos-line-endingsまたはhttp://hintsforums.macworld.com/archive/index.php/t-125.html)。何も動作せず、ファイルは変更されませんでした(^ Mを再現するにはCtrl-v Enterが必要でした)。結局、TextWranglerを使用しました。厳密にはコマンドラインではありませんが、機能し、文句を言うことはありません。
dos2unix
パッケージマネージャーを使用してインストールするだけです。これは非常に簡単で、ほとんどのプラットフォームに存在します。