web-dev-qa-db-ja.com

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

現在のファイルの各,を新しい行に置き換えます。

:%s/,/\n/g 

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

私は何をすべきか?

私のように興味があるなら、な​​ぜVimの改行なのでしょうか?

1775
Vinko Vrsalovic

\rの代わりに\nを使用してください。

\nで置き換えると、テキストにNULL文字が挿入されます。改行するには\rを使います。改行を検索した場合でも、\nを使用します。この非対称性は、\n\rやや異なることをする :という事実によるものです。

\nは行末(改行)に一致し、\rはキャリッジリターンに一致します。一方、置換では\nはヌル文字を挿入しますが、\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を挿入しました。

2317
Konrad Rudolph

これがトリックです:

まず、vi(m)セッションを特殊文字とのパターンマッチングを許可するように設定します(例:改行)。この行をあなたの.vimrcまたは.exrcファイルに入れる価値があるでしょう。

:set magic

次に行います。

:s/,/,^M/g

^M文字を取得するには、次のように入力します。 Control - v そしてヒット Enter。 Windowsでは、 Control - q、 Enter。私がこれらを覚えることができる唯一の方法は彼らがどれほど意味をなさないか覚えていることによってです:

A:改行を表すのに使うべき最悪の制御文字は何でしょうか?

B:q(通常は「終了」を意味するため)またはvのいずれかを入力するのは簡単です) Control - c 誤ってエディタを終了してください。

A:そうしてください

184
Logan

s/foo/bar\r\nという構文では、文脈によって意味が異なります。


ショート:

fooの場合:
\n =改行(linux/macではLF、WindowsではCRLF)
\r =キャリッジリターン(CR)

barの場合:
\r =は改行です
\n =ヌルバイト。

より長い:(ASCII数字付き)

NUL = 0x00 = 0 = CTRL@
LF = 0x0A = 10 = CTRLJ
CR = 0x0D = 13 = CTRLM

これは ASCII制御文字 のリストです、それらをvimに挿入してください。 CTRLvCTRL---key---
bashや他のunix/linuxシェルでは、ただタイプするだけです。 CTRL---key---。やってみる CTRLM bashでは、打撃と同じ ENTERLinuxシステムが改行にラインフィードを使用していても、シェルがその意味を理解しているので。

リテラルをbashに挿入するには、その前に CTRLv また動作します。

Bashで試してください。

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

これは ANSIエスケープシーケンス を使い、2つの^[を次のように挿入します。 CTRLvESC

あなたも試すかもしれません CTRLvCTRLmENTERこれはあなたにこれを与えるでしょう:

bash: $'\r': command not found

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

この ASCII制御文字 リストは、完全な ASCII記号表 とは異なり、制御文字は、コンソール/疑似端末/ vimに挿入されます。 CTRL キー(笑)、そこにあります。 C言語や他のほとんどの言語では、通常これらの「文字」を表すために8進コードを使用します。

あなたが本当にこれらすべてがどこから来ているのか知りたいのなら: http://www.linusakesson.net/programming/tty/
これはあなたがこのトピックについて遭遇する最良のリンクですが、注意してください:ドラゴンがあります。


TL; DR

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

84
sjas

あなたが使用する必要があります

:%s/,/^M/g

^M文字を取得するには、を押します。 Ctrlv に続く Enter

50
dogbane

\rはあなたのためにここで仕事をすることができます。

33
Lasar

Windows上でVimを使う Ctrl+Q 代わりに Ctrl+V

22
grantc

これは私が考える方法のための最良の答えですが、それはテーブルでより良くなっていたでしょう: https://stackoverflow.com/a/12389839/962394 .

だから、言い換え:

正規表現の置き換えに改行(ascii \r、unix newline)を使用するには0x0aを使用する必要がありますが、それは置き換えに特有のものです - 通常は\nを改行に、\rを改行に使用することを期待し続けます。

これはvimがNIL文字(ascii \n)を意味する代わりに0x00を使ったためです。あなたはNILが代わりに\0であることを期待していたかもしれません、\nをその通常の改行のための使用のために解放します、しかし\0はすでに正規表現置換において意味を持ち、\nにシフトされました。そのため、改行を\nから\r(正規表現パターンではキャリッジリターン文字、ascii 0x0d)にシフトします。

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

注意:^M(LinuxではCtrl-V Ctrl-M)は、他の人がアドバイスしたように(正規表現を試しただけで)キャリッジリターンではなく正規表現の置き換えに使用すると改行を挿入します。

また、vimはファイルフォーマットの設定に基づいてファイルに保存するときに改行文字を変換するので、混乱するかもしれません。

10
codeshot

Eclipseからは、^M文字を1行に埋め込むことができ、それらを改行に変換する必要があります。

:s/\r/\r/g
10
rickfoosusa

しかし代用しなければならないならば、次のことがうまくいく

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

上記では、すべての次の行が次の行、次に| - 、そして次の行に置き換えられます。これはウィキテーブルで使われています。テキストが次のようになっているとします。

line1
line2
line3

に変更されます

line1
|-
line2
|-
line3
7

ファイル全体を処理する必要がある場合は、コマンドラインから試すこともできます。

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

私のために働いた答えをヘレス。この男から

----引用 http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


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

検索と置換に改行文字を挿入するには、次の手順を実行します。

:%s/look_for/replace_with ^ M/g上記のコマンドは“ look_for”のすべてのインスタンスを“ replace_with\n”に置き換えます(\ nは改行を意味します)。

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


4
user407749