vimで開いたファイルで^ M改行を「通常の」改行に変換する方法は?


481

vimは^ Mで終わるすべての行に表示されます

これを「通常の」改行に置き換えるにはどうすればよいですか?



3
ソリューションをファイル形式の変更に変更してください。これが最もクリーンなソリューションです。
erikbwork 2016年

1
この質問はvimに関するものですが、他のGoogle検索もこのスレッドに含まれています。:だから、あなたは、Eclipseを使用すると、単一のファイルまたは数回クリックするだけでファイルの完全なフォルダツリーのいずれかの行区切り文字を変換することができ、システムにインストールしている場合stackoverflow.com/a/7019737/1364747
テディ

通常の改行を「通常」と呼ぶのが好きです-^ Mの改行とは対照的に:-)
DerMike

回答:



577

コマンド

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

どこ<Ctrl-V><Ctrl-M>手段タイプCtrl+ Vその後、Ctrl+ M

説明

:%s

代替、%=すべての行

<Ctrl-V><Ctrl-M>

^ M文字(Ctrl-VはVimでCtrl ^文字を書く方法であり、Ctrl-Mは正規表現の後にMを書き、その結果^ M特殊文字になります)

/\r/

改行付き(\r

g

そして、それをグローバルに行います(行の最初の出現だけではありません)。


21
^ M文字は削除されましたが、キャリッジリターンは挿入されません。
ラッキータクシー

14
@jumpnett-キーコードCtrl-V / Ctrl-Mを押す必要があります。逐語的なテキストとして入力する必要はありません。
LeopardSkinPillBoxHat

33
これは間違いなく質問に対する正しい答えです。^ Mの後に改行が続く場合は、改行を残して^ Mを削除します。以下のその他の置換を行うと、ファイルがダブルスペースになります。
dlamblin 2013年

12
それでもキャリッジリターンがない場合(つまり、^ Mは削除されていますが、すべてが1行で折り返されています)、次のようにします:%s/<Ctrl-V><Ctrl-M>/\r/g(\ rは^ Mを改行に置き換えます)。
William Turrell 2014

7
WindowsでVimを実行している場合は、<Ctrl-V>ではなく<Ctrl-Q>を使用する必要があります。
GrandAdmiral 2014年

418

LinuxおよびMac OSでは、次のように動作します。

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

where ^V^MはタイプCtrl+ V、次にCtrl+を意味しMます。

注:デフォルトではテキストの貼り付けにマップされているため、Windowsではおそらくの^Q代わりに使用する必要があります。^V^V


3
なぜこれは反対票を投じたのですか?ファイルの行末が間違っているため、ファイルが1行に分割されている場合でも機能します。
ポールトンブリン

2
いいえ。私の方法では、ファイルの行末が正しいものに置き換えられます。
ポールトンブリン

7
これは、ファイルに新しい行がない場合の別の問題に対するものです。FYI ^ Mは、\ rと一致させることができます
dlamblin 2013年

12
これは非常に神秘的なコマンドですが、Macで動作します。
エリックウォーカー

5
行末に%s/\r/\r/gのみ表示されるファイル^M(MacVimの用語では1つの長い行)について、MacVim では同等のものがうまく機能することがわかりました。明らかに\ rは、このコマンドのパターンと置換部分でパターンが異なることを意味します。
RichVel

184

vimで、ファイル形式を確認します— DOSまたはUnix:

:set filetype=unix

:set fileformat=unix

ファイルはキャリッジリターン(CR、^ M)文字なしで書き戻されます。


3
use:set fileformat = unixほとんどの構成では、filetypeは使用されている構文タイプのみを変更します。
derGral

6
これにより、私が抱えていたバグが修正されました... Vimは、UNIX形式のファイルがWindowsであると考え始め、新しく変更された行がgit diffに^ Mを表示していました。
トーマスハンターII

システムに依存する必要があります。今日、これはうまくいきました。setコマンドはvim、btw内で実行されます。
gbarry

1
ファイル形式はdosなので、それをunixに設定して問題ありません
zhaozhi

3
また、これはところでviの上で動作し、あなたが行うことができますset ff=unix同じように少しショートカットとしてftのショートカットですfiletype
Posva

110

MacVimでBBEditを使用して作成したファイルに^M、通常の改行ではなく一連の改行が表示されていました。次の文字列置換で問題が解決しました-これが役立つことを願っています:

:%s/\r/\r/g

改行を同じ文字に置き換えるので興味深いですが、Vimは正しく表示するために新しい\ rを取得する必要があるだけだと思います。これが機能する理由の根本的な仕組みを知りたいと思います。


1
検索機能は、行末シーケンスを認識するためのより広い規則を受け入れる傾向があります。ただし、データとして書き込まれる場合、\ rには特定の意味があります。
gbarry

これは、Windows gVimで改行せず、代わりに大量の^ Mを含むファイルを整理するのに役立ちました。
フラッシュ

2
このページで提供されているすべてのソリューションから、これがcsvファイルから^ Mを削除するのに私が機能した唯一のパターンでした。MacVimを使用する。
B6431 2014年

+1は、Mobatermを使用してWindowsからUbuntu TrustyにSSHで接続しているときにも機能しました
カール

したがって、これは、置換として指定されているにもかかわらず、すべての\r文字をで置換するように見えました。文句を言わない、それがまさに私が欲しかったものです。変だ。\n\r
2014年

34

まず、 :set ff?して、ファイルのファイル形式を把握します。

私はそれが可能性があると思うunix、それから問題はあなたのファイルがfileformat=dos「^ M ^ J」を行末に追加して作成されたが、flieformat=unix、「^ M」をそこに残して行末から「^ J」を削除するだけで。

:e ++ff=dosVimコマンドラインに入力するだけで、ファイルの形式をunixからdosに変更できます。問題を解決するはずです。そうでない場合は、:%s/\r//gあなたを助ける必要があります。


3
私は両方をしなければなりませんでした。:e ++ff=dosその後、:set ff=unixおよび:w
マックス

29

^ M文字を一致させるには、視覚的に選択し、OSのcopy to clipboardコマンドを使用して文字を取得する必要がありました。replaceコマンドを実行する前に、文字を検索することでテストできます。

/^M

最初の不良行を選択する必要があります

:%s/^M/\r/g

すべての誤った^ Mを改行で置き換えます。

これは、gvim 7に基づくMacVimの関数と同じです。

編集:

Ubuntu for WindowsがインストールされているWindows 10マシンでこの問題が再び発生すると、vimのファイル形式の問題が発生すると思います。この場合、ffをunix、mac、またはdosに変更しても、^ Mを^ Jに変更して再度戻す以外に何もしませんでした。

この場合の解決策:

:%s/\r$/ /g
:%s/ $//g

私がこのルートを選んだのは、ファイルを破壊しないようにしたかったからです。ができた:%s/\r$//gいたが、それによってキャリッジリターンがすぐに削除され、予期しない結果が生じる可能性がありました。代わりに、単数形のCR文字(ここでは^ M文字)をスペースに変換し、行末のすべてのスペースを削除します(これは私にとっては望ましい結果です)

長い間回答されてきた古い質問を復活させて申し訳ありませんが、混乱が生じているようで、Google検索で高まっているので、そのいくつかを明らかにしたいと思います。


1
ctrl-v ctrl-mを押すと、fwiwと同様に文字が挿入されます。しかし、\ rは適切な改行を挿入するものです。
メタグラファー、2011年

1
これが正しい答えです。上記のように、<ctrl-v> <ctrl-m>を使用して、コマンドにリテラル^ Mを挿入します。
カルロサヤム

1
私は同意しますが、元の投稿時にそれがうまくいったなら、投稿しなかったことは確かです。;)
メタグラファー

22

これらのどれも私にとってはうまくいかなかったので、私はこれを試しましたが、うまくいきました:

タイプ :%s/

押す CTRL-VCTRL-M

タイプ //g

押す Enter

したがって、Vim shoudの全体的なコマンドは次のようになります。 :%s/^M//g

これが何をするか:(:%s検索して置換)/^M/(その記号)/(文字なし)g(全体)。


バンオン!! Macで動作します。
shamail


15

Ctrlを使用する必要なし: :%s/\r$//


1
これも私がやるやり方です。コマンドを思い出せない
pixel 67

これは、これらのエンディングを削除するための推奨される方法です。
メタ


12

私はsedでこれをしました:

sed -i -e 's/\r/\n/g' filename


これで問題ありませんか?OSXの場合:sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

はい、動作します(私はよく使用します)が、OSXでは、sedのGNUバージョンがインストールされていない場合、動作しない可能性があります。Appleがデフォルトで出荷するsedのバージョンは、すべてのLinuxディストリビューションで出荷されるGNUバージョンとは(悲しいことに)大きく異なります。詳細については、この質問への回答を確認してください: stackoverflow.com/q/30003570/2062384
Freedom_Ben

@Freedom_Benに感謝します。したがって、これは(OSXで見つかったように)GNU sedでは機能するがBSDでは機能しないようsedです。改行を修正する人はおそらくオペレーティングシステムの組み合わせで作業しているので、答えがいつ機能するかを明確にしておくと役立ちます。
アルマンド

10

ちょうど何について: :%s/\r//g それは完全に私のために働いた。

これは、すべての行の行末をクリーンアップするだけで、^ Mを削除します。


9

この質問には他にも多くの回答がありますが、コマンドラインソリューションが必要だったので、次の方法が私にとって最適です。

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

説明:

  • .vimrcファイルを読み込まずに、 myfile
  • 走る :e ++ff=dosdos行末としてファイル全体を強制的にリロードするためにします。
  • :w ++ff=unixUNIXの行末を使用してファイルを書き込むために実行します
  • vimを終了

3
ありがとうございました!これは私の問題を修正し、スクリプトで使用すると便利であることがわかりました
Peddipaga

8

Ctrl+ Mウィンドウを最小化しますが、実際にはCtrl+ 文字をEnter挿入し^Mます。またCtrl、プレスの合間にキーを持ち上げないように注意する必要がありました。

だから私のための解決策は:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

どこ<Ctrl-V><Ctrl-Enter>に手段プレスとホールド Ctrl、プレスリリースやV、プレス、リリースEnterおよびその後のリリース Ctrl

Windowsで生成されたファイルで作業している場合

すでに目に見えない存在であるため、上記のソリューションは、既存の行の間に追加の行を追加します\r^M

これを防ぐには、^M文字を置き換えずに削除します。

:%s/<Ctrl-V><Ctrl-Enter>//g

ここで%、「このバッファー内」、「s置換」、「/次のパターンを(見つける)」<Ctrl-V><Ctrl-Enter>^M文字を取得するために押すキー(上記を参照)、//「何もない」(または「パターン付き」を意味します。空の2つのスラッシュの間)」であり、行の最初の出現とは対照的に、「全体的に」を意味gするフラグです。


7

これは私のために働きました:

  1. ファイル形式をunixに設定(\n行末)
  2. ファイルを保存する

だからvimで:

:set ff=unix
:w

1
これは私にとってはうまくいきましたが、受け入れられた答えはうまくいきませんでした。
Marcello Romani 2017年

7

私の場合、

上記は何も機能しませんでした。CSVファイルをMacからLinuxマシンにコピーし、上記のすべてのコマンドを使用しましたが、以下の1つしか役に立ちませんでした

tr "\015" "\n" < inputfile > outputfile

次のような^ M文字が行の間に挟まれたファイルがありました

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

5

あるいは、dos2unixおよびunix2dosと呼ばれるオープンソースのユーティリティがあり、これを行うことができます。Linuxシステムでは、おそらくデフォルトでインストールされます。Windowsシステムの場合は、http: //www.bastet.com/ からダウンロードできます。



4

ファイルがWindowsで作成された場合はdos2unixユーティリティを使用し、ファイルがMacで作成された場合はmac2unixユーティリティを使用します。:)


以前にmac2unixについて聞いたことがないので、できればもう一度賛成票を投じるでしょう
Kuf

フレイ!これが道です!
プライベート



1

するにはキーストロークを保存するには、タイピング避けることができますCtrl+ VCtrl+のMマッピングでこれを置くことによって。^ M文字を含むファイルを開き、それをヤンクして、.vimrcの次のような行に貼り付けます。

nnoremap <Leader>d :%s/^M//g<CR>

1

^Mvimとeclipseの両方で作業しているときに、これらの提案のどれもうまく機能せず、改行が大量に発生しました。私は外部のケースに遭遇したのではないかと思いますが、それが私がした人を助ける場合に備えて。

:%s/.$//g

そしてそれは私の問題を整理しました


これにより、行末の文字がすべて削除されます。何らかの理由で^ Mで終了していない行がある場合、その文字も削除され、予期しない結果になります。これは当てはまらないはずですが、そうであり、あなたがこれを知らない場合は、ファイルを特定するのが非常に困難な方法で悪用することができます。
Metagrapher


1

^M不要な改行を行います。これを処理するにはsed、次のコマンドを使用できます。

sed 's/\r//g'

idkなぜこれが-1に反対投票されたのですか... sedを使用しているためですか?vim内で同じ置換を行うことができ、それ機能するはずです
Metagrapher

1

set binary.vimrcを削除するだけです!


別のスレッドでは、新しい行の自動挿入を取り除くために「バイナリの設定」が推奨されていました。
dexter2305 2017年

1

sedMacOSで使用するには、次のようにします。

sed -i.bak $'s/\r//' <filename>

説明:$'STRING'ここの構文は、bashシェルに関連しています。Macは\r特殊文字として扱いません。コマンド文字列を引用することで、ANSI-C標準で指定されている実際の文字で$''置き換えるようにシェルに指示しています。\r\r


0

"この関数はジャンプのリストを保存します

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

この場合、* NIXのネイティブdos2unixコマンドを使用することの何が問題になっていますか?linux.die.net/man/1/dos2unix
Metagrapher

0

私は午後に\ n ctrl-v 012(どちらもnullを提供する)と格闘しました。&メタグラファーに到達するまで、このスレッドを介して苦労しました。

\r 私のためにうまくいきました!

/),/s/),/)\r/g

このようなものになった:

blacklist-extra:i386(0.4.1、0.4.1 + nmu1)、libmount1:i386(2.20.1-5.1、2.20.1 -5.2)、libblkid1:i386(2.20.1-5.1、2.20.1-5.2) 、libapt-pkg4.12:i386(0.9.7.4、0.9.7.5)、nmap:i386(6.00-0.1、6.00-0.2)、libsane-common:i386(1.0.22-7.3、

このようなものに:

26 libwv-1.2-4:i386(1.2.9-3、自動)
27 openjdk-6-jre-headless:i386(6b24-1.11.4-3、自動)
28 jed:i386(0.99.19-2.1)

マジック。私は深く感謝しています

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