Vimで文字を改行で置き換える方法


1967

,現在のファイルのそれぞれを新しい行に置き換えようとしています:

:%s/,/\n/g 

しかし、それ^@は実際の改行の代わりにのように見えるものを挿入します。ファイルはDOSモードまたはその他のものではありません。

私は何をすべきか?

興味があれば、私のように、なぜVraの\ ra newlineはなぜですか?同様に。


2
Stack Overflowは、プログラミングと開発に関する質問のためのサイトです。この質問はプログラミングや開発に関するものではないため、トピックから外れているようです。ヘルプセンターで、どのようなトピックについて質問できますかをご覧ください。おそらく、スーパーユーザーまたはUnix&Linux Stack Exchangeのほうがよいでしょう。
JWW

5
@jwwこの質問は10年前のものです...移行するには古すぎるようです。このような質問の多くは、たとえば、ありますstackoverflow.com/questions/10175812/...
Vinko Vrsalovic

14
@jww vimは、プログラマーに一般的に使用されるツールであり、プログラマーに一般的に使用されるツールに関する質問は、Stack Overflowのトピックで取り上げられています。明らかにこれはViとVimでより適切です。
user202729

回答:


2565

\r代わりに使用します\n

置換すると\n、テキストにnull文字が挿入されます。改行を取得するには、を使用します\r。ときに検索改行のために、あなたはまだ使用したい\nが、。この非対称性は、\n\r わずかに異なること行うという事実によるものです。

\n行末(改行)と\r一致し、キャリッジリターンと一致します。一方、置換で\nはnull文字が\r挿入されますが、改行が挿入されます(より正確には、入力として扱われます<CR>)。Vimコマンドライン機能を使用して、これを説明する小さな非対話型の例を次に示します(つまり、以下をコピーしてターミナルに貼り付けて実行できます)。xxd結果のファイルの16進ダンプを示します。

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

つまり、\nバイト0x00をテキストに挿入しました。\rバイト0x0aを挿入しました。


127
/ rは、Enter / Returnキーを押すこととして扱われます。すべてのプラットフォームで動作します。
Luka Marinko、


14
これが古典的なviでうまくいくといいのですが。AIX v6.1では、\rこのように機能しません。しかしCtrl-V Enter、タイピングの代わりにを押すことができ\r、それは機能します。
eksortso 2013

3
パーティーに遅れました。nullを\r挿入<CR>および\n挿入する場合、何かをキャリッジリターンで置き換えるにはどうすればよいですか?
Llama氏、2015年

2
@SunnyRajあなたはCRとLFの歴史について確信がありますか?もともとLFは紙を1行前に動かしたがプリントヘッドを動かさなかった、そしてCRはプリントヘッドを動かしたが紙を動かさなかったという印象を受けました。その結果、OSが印刷前に入力を変換しなかった場合、LFとCRだけを使用して正しい出力を得ることができませんでした。MS DOSは生のプリンターデータをテキストファイル形式として使用し、Mac OSはCRを使用してそれをプリンターの生形式に変換し、UNIXはLFを使用してそれをプリンターの生形式に変換しました。
Mikko Rantalainen 2017

210

ここにトリックがあります:

最初に、Vi(m)セッションを設定して、特殊文字(つまり、改行)とのパターンマッチングを許可します。おそらくこの行を.vimrcまたは.exrcファイルに入れる価値があります。

:set magic

次に、次を実行します。

:s/,/,^M/g

^M文字を取得するには、Ctrl+ Vを入力してを押しEnterます。Windowsでは、行いますCtrl+ QEnter。私がこれらを覚えている唯一の方法は、彼らがどれほど意味をなさないかを覚えることです。

A:改行を表すために使用する最悪の制御文字は何ですか?

B:どちらかq(それは通常意味するので、「終了」)、またはvそれはそう簡単に入力することですので、Ctrl+ C誤って、エディタを殺します。

A:そうしてください。


9
WindowsでGVimを使用していますが、:set magic(〜/ _vimrcにもありません)もも必要ありませんctrl-q。単純なctrl-v後にエンターを^M押すだけで、私のキャラクターがうまく作成されます。
Chris Phillips

5
Cvは改行を表しません。「次のリテラル文字をエスケープする」コマンドです。Cvがどちらのニーモニックなのかはわかりませんが、精神的に改行にマップされない理由があります。
ジムスチュワート

27
Ctrl-vは「逐語的」のニーモニックです。つまり、次のキーを押して「逐語的」なキーコード/文字にエスケープします。Windowsではそれを貼り付けます。Ctrl-Qは "(un)Quote"のたぶんです。とにかく、ばかげていますが、バイナリファイルで使用できます。たとえば、Ctrl-AからCtrl-Zまで検索できます(Ascii 1-26と思います)。
Tomasz Gandor 2013年

1
Ctrl-Cエディタを強制終了することはありませんが、通常モードに戻ることはできます。Ctrl-V逐語的をCtrl-Q意味し、誰かが$VIMRUNTIME/mswin.vim設定ファイルのロードを間​​違えたことを意味します。mswinは必要ありません。代わりに独自のvimrcを使用してください。
00dani 2016年

うわー---これは素晴らしいです。sed -n l 今まではやっていました。同じことがCtrl-vvim でも実現できることを知っておくと役に立ちます。
arpit

98

構文ではs/foo/bar\rおよび\nコンテキストに応じて、異なる意味を持っています。


ショート:

の場合foo

\ n =改行(Linux / MacではLF、WindowsではCR + LF)
\ r =改行(CR)

の場合bar

\ r =は改行です
\ n = nullバイト。

より長い(ASCII番号を使用):

NUL= 0x00 = 0 = Ctrl+ @
LF= 0x0A = 10 = Ctrl+ J
CR= 0x0D = 13 = Ctrl+M

以下は、ASCII制御文字のリストです。Ctrl+ VCtrl+ を使用してVimに挿入します---key---

Bashまたは他のUnix / Linuxシェルでは、単にCtrl+と入力し---key---ます。

BashでCtrl+ Mを試してください。EnterLinuxシステムでは行区切りに改行が使用されていますが、シェルは意味を理解しているため、を押すのと同じです。

リテラルをbashに挿入するには、前にCtrl+ Vを付けることもできます。

バッシュで試してください:

echo ^[[33;1mcolored.^[[0mnot colored.

これはANSIエスケープシーケンスを使用します。2挿入^[経由さんをCtrl+ VEsc

Ctrl+ VCtrl+ M、も試してみてくださいEnter

bash: $'\r': command not found

\r上から覚えていますか?:>

このASCII制御文字リストは、完全なASCIIシンボルテーブルとは異なります。制御文字は、Ctrlキー(ハハ)を介してコンソール/疑似端末/ Vimに挿入され、そこにあります。

Cおよび他のほとんどの言語では、通常、これらの「文字」を表すために8進コードを使用します。

これがどこから来たのかを本当に知りたい場合:TTY demystified。これは、このトピックについて遭遇する最良のリンクですが、注意してください。ドラゴンがいる。


TL; DR

通常foo= \n、およびbar= \r


1
したがって、文字をキャリッジリターンで置き換える方法に興味をそそられます。
コードショット

2
@codeshot :s/x/^M/gを実行する必要があります。^Mビアのctrl-v後にを挿入しctrl-mます。
sjas 2015

3
sjasさん、ありがとうございます。この質問は、これまでで最も奇妙な質問の1つです。1008は、基本的には「vimが見つけたものを実行します。vimが見つけたものを実行するからです。vimが見つけたものを実行することを忘れないでください」という答えに投票します。私は、パターン内の興味深い文字のコードのリスト、置換、および奇妙さの理由を見つけて、他の同様の奇妙さを簡単に覚えて予測できるようにしたいと思っていました。それは私の投票を得たでしょう。
codeshot 2015

@codeshotのASCII制御文字のリストが役立つかもしれません。詳細については、cs.tut.fi /〜jkorpela / chars / c0.htmlを参照してください。2つのリンクを含めるように回答を更新します。
sjas 2015

55

使用する必要があります:

:%s/,/^M/g

取得するには^M、文字を、プレスCtrl+がv続きますEnter


4
^ M文字を取得するには、<Cv> <Cm>を実行する必要があります。
Jezen Thomas


24

WindowsのVimでは、Ctrl+のQ代わりにCtrl+を使用しますV


16

これは私が考える方法に対する最良の答えですが、表ではより優れていたでしょう。

Vraの\ ra改行はなぜですか?

言い換えれば、

正規表現の置換で\rラインフィード(ASCII 0x0A、Unix改行)を使用するには、を使用する必要がありますが、これは置換に固有です。通常は\n、ラインフィードと\rキャリッジリターンに使用することを引き続き期待する必要があります。

これは\n、代わりにVim がNIL文字(ASCII 0x00)を意味するために使用されたためです。\0代わりにNILが\n通常のラインフィードの使用に解放されていると思っていたかもしれませんが、\0既に正規表現の置換で意味があるため、に変更されました\n。したがって、さらに改行を\nから\r(正規表現パターンでは復帰文字ASCII 0x0D)にシフトします。

キャラクター| ASCIIコード| C表現| 正規表現一致| 正規表現の置き換え
------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
nil | 0x00 | \ 0 | \ 0 | \ n
改行(Unix改行)| 0x0a | \ n | \ n | \ r
キャリッジリターン| 0x0d | \ r | \ r | <不明>

注意:^M(LinuxではCtrl+ V Ctrl+ M)他の人が助言したように、キャリッジリターンではなく正規表現の置換で使用すると改行が挿入されます(私は試してみました)。

また、Vimはファイル形式の設定に基づいてファイルに保存するときに改行文字を変換するため、問題が発生する可能性があることに注意してください。



8

しかし、代替が必要な場合は、次のことが機能します。

:%s/\n/\r\|\-\r/g

上記では、すべての次の行が次の行で置き換えられ、次に|-新しい行で置き換えられます。これはwikiテーブルで使用されます。

テキストが次の場合:

line1
line2
line3

に変更されます

line1
|-
line2
|-
line3

7

ファイル全体に対して実行する必要がある場合は、コマンドラインから試すこともできます。

sed 's/\\n/\n/g' file > newfile

1
これにはGNU sedが必要です。試してみてくださいprintf 'foo\\nbar\n' | sed 's/\\n/\n/g'、それはあなたのシステム上で動作するかどうかを確認します。(この提案については、フリーノードの#bashの善良な人々にクレジットを提供してください。)
エヴァン・ドノバン

はい、しかし質問はVimについてでした。Stack Overflowの質問があります。sedを使用して改行(\ n)を置き換えるにはどうすればよいですか?
Peter Mortensen

5

ここで私のために働いた答えがあります。この男から:

----引用viエディターを使用して、置換に改行文字を挿入します


他に何かしなければならないこと、覚えていないこと、そして調べなければならないこと。

viでは、検索と置換に改行文字を挿入するには、次のようにします。

:%s/look_for/replace_with^M/g

上記のコマンドは、「look_for」のすべてのインスタンスを「replace_with \ n」に置き換えます(\ nは改行を意味します)。

「^ M」を取得するには、キーの組み合わせCtrl+を入力し、Vその後(すべてのキーを離して)キーを押しEnterます。


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