vimでDOSの行末をLinuxの行末に変換する


717

Windowsで作成したファイルを開くと、すべての行がで終わり^Mます。
これらの文字を一度にすべて削除するにはどうすればよいですか?


あなたがやるhexdump -C badfile0x0d 0x0a "\r\n"それがあなたの問題であることがわかりました。
Yzmir Ramirez

回答:


1075

DOS2UNIXはこれを行いますコマンドラインユーティリティである、または:%s/^M//gあなたが使用する場合Ctrl- v Ctrl- m入力^ Mに、またはあなたのことができ:set ff=unix、Vimがあなたのためにそれを行います。

「fileformat」設定に関するドキュメントはこちらです。vimwikiには、改行変換に関する包括的なページがあります

あるいは、ファイルを何度も前後に移動する場合、それらを変換するのではなく、変換したい場合がある:set ff=dosため、vimはそれがDOSファイルであることを認識し、行末にDOS規則を使用します。


56
:%s/^M//gである必要があります:%s/\r//g。これ^Mは、「行の先頭で大文字の「M」に一致する」という意味だけです。
Bunyk 2013

78
答えが言うようにして、「ctrl-v ctrl-mを使用して^ Mを入力する」場合はそうではありません。
pjz

2
crtl-vは良くありません。Windowsでは、クリップボードの内容をコマンドラインに貼り付けます。ソリューション:%s/\r//gは私のために働いた、@ Bunykを乾杯
roblogic

3
@ropata Windowsで必要なのはctrl-qです。
ruffin 2016

2
set ff=unix何もしないので、私は何かを逃しているに違いない。多分それはファイルを変換しますが、すべての^M文字はまだそこにあります。
felwithe 2017年

276

ビューの行末を変更します。

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

これは、保存操作としても使用できます(:wだけでは、画面に表示される行末を使用して保存されません)。

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

そして、あなたはコマンドラインからそれを使うことができます:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

4
どうもありがとうございました。私のような怠惰なもののためにvi + ':wq ++ ff = unix' <filepath>を試しました。
a_secenthusiast

2
これが最も賛成の答えになるはずです。:w +ff=unixここに書かれている他のほとんどのものよりもはるかに優れており、bashスクリプトは素晴らしいボーナスです。
mkasberg 2017年

:eコマンドがインストールvimの私のWindows上で何かをするためには表示されません。私のビューはまだ^Mコードを示しています。
Grant Birchmeier 2017年

160

私は通常使用します

:%s/\r/\r/g

これは少し奇妙に思えますが、vimが改行と一致する方法のために機能します。私も覚えやすいです:)


9
これはプラットフォーム間で一貫して機能します。ここで最良の答えです。
thebigjc

4
今まで問題はなかった:set ff=unixが、今日開いたファイルは特に奇妙だったに違いない。Vimはすでにそうfileformat=unixだと言ったが、すべての行末はそうだった^M。この解決策は私にとってうまくいきました。
クリスB

15
このソリューションでは、不要な行が追加され、ファイルの行数が2倍になります。:%s/\r//g代わりに私のために働きます。
ビクターザマニアン2013

3
ビクター、ファイルの末尾は\ r \ nである可能性があります。\ rは改行として読み取られませんが、\ nは読み取られます。私が実行しているファイルには\ rがあり、改行文字を追加する必要があります。
Joeyjoejoejr 2015

2
@VictorZamanian :%s/\r//g唯一の汎用ソリューションです。特に、DOSスタイルとUNIXスタイルの両方の改行が混在する異種モードのファイルを含む混合モードファイルの場合はそうです。標準的な解決策は、(例えば、:set ff=unix:e ++ff=unix)同じ改行スタイルで現在のバッファ端のすべての行を前提としています。時々彼らはそうします。時々彼らはしません。悲しみのキュー。
セシルカレー

97

私は次のコマンドを使用することを好みます:

:set fileformat=unix

macまたはdosを使用して、ファイルをmacintoshまたはMS-DOS / MS-Windowsファイル規則にそれぞれ変換することもできます。そして、ファイルがすでに正しい形式である場合は何もしません。

詳細については、vimのヘルプを参照してください。

:help fileformat

1
このコマンドは私のWindows vimでは何もしないようです。私の見解にはまだ^M文字が含まれています。
Grant Birchmeier 2017年

set fileformat=unix.vimrcファイルへの追加が機能しました。
ジョーイアレン

20

:set fileformat=unix dosからunixに変換します。


1
これで実際に問題が解決しました。検索中にそれらの文字を見つけることができませんでした。
Insaneo船長2015

20
:%s/\r+//g

Vimでは、これによりすべての改行が削除され、改行のみが残ります。


2
上記のいくつかの理由で、windows gvimでは動作しませんでした。しかし、:%s/\r//gそれに変更されたとき、それは魅力のように機能しました。
soltysh 2014年

1
@soltysh:%s / \ r \ + $ // g
thinker3 2015


10

ファイルのディレクトリをdosからUnixに変換する

コマンドラインとsedを使用して、現在のディレクトリで拡張子「.ext」を持つすべてのファイルを検索し、すべての「^ M」を削除します

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

また、上記のように^ M = Ctrl+V+ Ctrl+M(キャレット「^」記号とMを入力しないでください)


9

dos2unix ファイルの内容を直接変更できます。

一時的なファイルリダイレクトを必要とせずに、ファイルで直接使用できます。

dos2unix input.txt input.txt

上記は想定されるUSキーボードを使用しています。-UKキーボードを使用するには、437オプションを使用します。

dos2unix -437 input.txt input.txt



6

次のコマンドで:

:%s/^M$//g 

次に^M、表示されるタイプを取得します。 文字通り入力された次の文字を取るようにVimに指示します。CtrlVCtrlMCtrlV


6

^ Mを表示することに関するコメントは、私にとってうまくいきました。私のviで「^ M」と入力しただけでは何も見つかりません(見つかりません)。CTRL+ V CTRL+ Mシーケンスは完全にかかわらず、それをやりました。

私の作業代替コマンドは

:%s/Ctrl-V Ctrl-M/\r/g

私の画面では次のようになりました:

:%s/^M/\r/g

4
:%s代わりに使用できます:1,$s%はの省略形です1,$
Tin Man

5

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

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


これをLinuxサーバーで実行すると、ファイルに^M末尾がありました。保存する場合はdosとして保存し、削除する場合はlinuxとして保存します。使用して確認できますcat -v
HattrickNZ

この質問は、ナノではなくvimに関するものです。
Grant Birchmeier 2017年

5
:g/Ctrl-v Ctrl-m/s///

CtrlM文字\r、またはキャリッジリターンで、DOSの行末に追加されます。コマンドラインでCtrlVリテラルCtrlM文字を挿入するようにvimに指示します。

全体として見ると、このコマンドはすべて\rを何にも置き換えず、行末から削除します。



3

次のコマンド
:%s/^V^M//g
を使用できCTRLます。「^」は使用キーを意味します。


2

以下のコマンドは、現在のディレクトリにあるすべての.shファイルを再フォーマットするために使用され、Fedora OSでテストしました。

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

vimで次のように入力します。

:w !dos2unix %

これにより、現在のバッファーの内容がdos2unixコマンドにパイプされ、結果が現在の内容に上書きされます。Vimはファイルの再読み込みを要求します


2

Linuxコンソールで直接実行するには: vim file.txt +"set ff=unix" +wq


1

通常dos2unix、これに使用できるコマンドがあります。GNUとBSDのバージョンでは引数の扱い方が異なるため、必ずマニュアルを読んでください。

BSDバージョン:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

GNUバージョン:

dos2unix $FILENAME

または、dos2unixここに提案された回答のいずれかを使用して独自に作成することもできます。たとえば、

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}

1

私はどこかでこれを見たことを知っていました。FreeBSDログインのヒントは次のとおりです。

DOSファイルからすべての^ M文字を削除する必要がありますか?試す

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

このトピックは非常に古いですが、ウィキアから別のものを入れたいと思います:

%s/\r\+$//g

その塗りつぶしは、行末までのすべての改行記号(1つ以上の担当者)を見つけて削除するため\n、eolのままになります。


0

これが私のやり方です。dos EOLでファイルを開き、ファイルを保存すると、自動的にunix EOLに変換されます

autocmd BufWrite * :set ff=unix

0

WindowsでNotePadまたはNotePad ++でファイルを作成し、それをLinuxで開いてvimで開くと、各行の終わりに^ Mが表示されます。これを削除するには、

Linuxターミナルで、次のように入力します。

dos2unix filename.ext

これは必要な魔法を行います。


0

^ Mの代わりに改行が欲しかった。Perlが救い出します:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

またはstdoutに書き込むには:

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