vim で開かれたファイル内の ^M 改行を「通常の」改行に変換するにはどうすればよいですか?
-
03-07-2019 - |
質問
vim は ^M で終わるすべての行に表示されます
これを「通常の」改行に置き換えるにはどうすればよいですか?
解決
他のヒント
コマンド
:%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
そして、それをグローバルに実行します(最初の行だけでなく)。
LinuxおよびMac OSでは、次のように動作します。
:%s/^V^M/^V^M/g
where ^V^M
は、タイプ Ctrl + V 、次に Ctrl + M を意味します。
注:Windowsでは、デフォルトでは^Q
がテキストの貼り付けにマップされるため、^V
ではなく<=>を使用する可能性があります。
vim
内で、ファイル形式<!>#8212を確認します。 DOSまたはUnix:
:set filetype=unix
:set fileformat=unix
ファイルは、キャリッジリターン(CR、^ M)文字なしで書き戻されます。
MacVim で見たBBEditで作成したファイルは、通常のものの代わりに^M
行リターンの束を表示していました。次の文字列の置換で問題が解決しました-これが役立つことを願っています:
:%s/\r/\r/g
面白いのは、改行を同じ文字に置き換えるためですが、Vimを正しく表示するには新しい\ rを取得する必要があるだけだと思います。なぜこれが機能するのかという根底にある仕組みを知りたいと思います。
まず、使用します :set ff?
ファイルのファイル形式を確認します。
そうかもしれない unix
, の場合、問題はファイルが次の方法で作成されたことです。 fileformat=dos
行末に「^M^J」を追加しますが、次のように読みます。 flieformat=unix
行末から「^J」を削除するだけで、「^M」はそのまま残ります。
入力するだけ :e ++ff=dos
Vim コマンドラインでファイルの形式を unix から dos に変更します。問題は解決するはずです。そうでない場合は、 :%s/\r//g
あなたを助けてくれるはずです。
^ M文字を一致させるには、視覚的に選択し、OSのクリップボードへのコピーコマンドを使用して取得する必要がありました。 replaceコマンドを試す前にキャラクターを検索することでテストできます。
/^M
最初の不良行を選択する必要があります
:%s/^M/\r/g
すべての誤った^ Mをキャリッジリターンに置き換えます。
これは、gvim 7に基づいたMacVimの関数です。
編集:
Windows 10用のUbuntuを搭載したWindows 10マシンで再びこの問題を抱えていますが、これがvimのファイル形式の問題を引き起こしていると思います。この場合、ffをunix、mac、またはdosに変更しても、^ Mを^ Jに変更してから元に戻すしかありませんでした。
この場合の解決策:
:%s/\r$/ /g
:%s/ $//g
このルートに行った理由は、ファイルを破壊しないようにしたかったからです。 :%s/\r$//g
を使用することもできますが、キャリッジリターンがすぐに削除され、予期しない結果になる可能性があります。代わりに、ここでは^ M文字である単一のCR文字をスペースに変換してから、行末のスペースをすべて削除します(私にとっては望ましい結果です)
長い間回答されてきた古い質問を復活させて申し訳ありませんが、混乱が進行しているようで、これはGoogle検索で高くなっているので、その一部を解消するのに役立つと思いました。
これらのどれも私のために働いていなかったので、私はこれを試してみましたが、うまくいった:
タイプ:%s/
CTRL-V CTRL-M
を押すタイプ//g
Enter を押します
したがって、Vimの全体的なコマンドは:%s/^M//g
これの機能::%s
(検索と置換)/^M/
(その記号)/
(文字なし)g
(グローバル)。
Ctrlを使用する必要なし:
:%s/\r$//
私のために働いたシンプルなもの
dos2unix filename
sedでこれを行いました:
sed -i -e 's/\r/\n/g' filename
^ Mは Ctrl + V および M によって取得されるため、
s/^M//g
ただ:
:%s/\r//g
それは完全に私のために働いた。
これは、すべての行の行末を削除するだけで、^ Mを削除します。
Ctrl + M はウィンドウを最小化しますが、 Ctrl + Enter は実際に^M
文字を挿入します。また、押すたびに Ctrl キーを離さないようにしなければなりませんでした。
だから私にとっての解決策は:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
<Ctrl-V><Ctrl-Enter>
は、長押し Ctrl 、 V を押して放し、 Enter 、次にリリース Ctrl 。
Windowsで生成されたファイルで作業している場合
上記のソリューションでは、既存の行の間に追加の行が追加されます。これは、\r
の後に非表示の%
がすでにあるためです。
これを防ぐには、s
文字を置き換えずに削除します。
:%s/<Ctrl-V><Ctrl-Enter>//g
Where /
は、<!> quot;このバッファ内、<!> quot;を意味します。 //
は、<!> quot; substitute、<!> quot;を意味します。 g
は、<!> quot;(find)the following pattern、<!> quot;を意味します。 <=>は、<=>文字(上記を参照)を取得するために押すキーを指します。<=>は、<!> quot; withthing <!> quot;を意味します。 (または、<!> quot;これら2つのスラッシュの間にあるパターンで、空の<!> quot;)、および<=>は flag で、<!> quot;グローバルに、<! > quot;行の最初の出現とは対照的に。
この質問には他にも多くの回答がありますが、コマンドラインソリューションが必要なため、次の方法が最適です。
vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile
説明:
- .vimrcファイルをロードせずに、
myfile
を開きます
-
:e ++ff=dos
を実行して、DOS行末としてファイル全体を強制的に再読み込みします。 - UNIXの行末を使用して
:w ++ff=unix
を実行してファイルを書き込みます - vimを終了
これは私のために働いた:
- ファイル形式をUnix(
\n
行末)に設定します - ファイルを保存
vimの場合:
:set ff=unix
:w
私の場合、
上記の何も機能せず、CSVファイルをMacからLinuxマシンにコピーし、上記のすべてのコマンドを使用しましたが、助けになるものは何もありません
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,
別の方法として、dos2unixおよびunix2dosと呼ばれるオープンソースのユーティリティがあり、これがまさにこれを行います。 Linuxシステムでは、おそらくデフォルトでインストールされます。 Windowsシステムの場合、 http://www.bastet.com/ からダウンロードできます。
sed s/^M//g file1.txt > file2.txt
ここで^ Mは、 ctrl + v + m
の3つのキーを同時に押すことにより入力されます。Windowsでファイルが作成された場合は、dos2unixユーティリティを使用します。 ファイルがMacで作成された場合は、mac2unixユーティリティを使用します。 :)
これは私のために働いた:
:% s/\r\n/\r
キーストロークを保存するには、 Ctrl + V Ctrl + M これをマッピングに配置します。 ^ M文字を含むファイルを開き、ヤンクして、.vimrcの次のような行に貼り付けます。
nnoremap <Leader>d :%s/^M//g<CR>
これらの提案はどれも、vimとeclipseの両方で作業中に^M
の改行を大量に取得できたため、私にとってはうまくいきませんでした。外部のケースに遭遇したのではないかと疑っていますが、万が一の場合に役立ちます。
:%s/.$//g
そしてそれは私の問題を解決しました
:g/^M/s// /g
^M
を使用してShift+6 Caps+M
と入力すると、受け入れられません。
ctrl+v ctrl+m
と入力する必要があります。
^M
は、不要な改行を与えます。これを処理するには、次のようにsed
コマンドを使用できます。
sed 's/\r//g'
.vimrcでset binary
を削除するだけです!
次のコマンドのいずれかを使用します。
:%s/\r//g
または
:%s/\r\(\n\)/\1/g
<!> quot;この関数はジャンプのリストを保存します
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()
私は午後\ n ctrl-v 012で苦労しています(どちらもnullを提供してくれます)。 <!> amp;メタグラファーのものに到達するまで、このスレッドに苦労しました。
\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)
マジック。私は深く感謝しています
またはvimを使用する代わりに、このコマンドを使用して改行を修正することができます
fromdos <filename.txt>
お役に立てばと思います!