Vim で文字を改行に置き換える方法
質問
それぞれ交換してみます ,
現在のファイルに新しい行を追加します。
:%s/,/\n/g
しかし、それは次のように見えるものを挿入します ^@
実際の改行の代わりに。ファイルは DOS モードでも何でもありません。
どうすればいいですか?
私と同じように興味がある場合は、質問を確認してください Vim ではなぜ が改行なのでしょうか? 同じように。
解決
使用 \r
の代わりに \n
.
で置き換える \n
テキストにヌル文字を挿入します。改行を取得するには、次を使用します \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 が挿入されました。
他のヒント
コツは次のとおりです。
まず、特殊文字とのパターン マッチングを許可するように vi(m) セッションを設定します (例:改行)。おそらく、この行を .vimrc または .exrc ファイルに追加する価値があります。
:set magic
次に、次のことを実行します。
:s/,/,^M/g
を入手するには、 ^M
キャラクター、タイプ コントロール-v そして殴る 入力. 。Windows では、次のようにします。 コントロール-q, 入力. 。これらを思い出す唯一の方法は、それらがどれほど意味がないかを思い出すことです。
答え: 改行を表すために使用する最悪の制御文字は何でしょうか?
B: どちらか
q
(通常は「やめる」という意味なので) またはv
とても入力しやすいので コントロール-c 間違って編集者を殺してしまいます。答え: そうしましょう。
構文では s/foo/bar
\r
そして \n
文脈に応じて異なる意味を持ちます。
短い:
のために foo
:
= 改行 (Linux/Mac では LF、Windows では CRLF)
= キャリッジリターン (CR)
のために bar
:
= は改行です
= ヌルバイト。
より長いです:(ASCII 数字付き)
NUL
= 0x00 = 0 = CTRL@
LF
= 0x0A = 10 = CTRLJ
CR
= 0x0D = 13 = CTRLM
ここにそのリストがあります ASCII 制御文字, に挿入します。 vim
経由 CTRLvCTRL - -鍵 - -.
で bash
または、他の unix/linux シェルでは次のように入力します。 CTRL - -鍵 - -. 。試す CTRLM bash では、叩くのと同じです 入力, Linux システムでは行区切りに改行を使用しますが、シェルはその意味を理解しているためです。
bash にリテラルを挿入するには、先頭に次の文字を追加します。 CTRLv も機能します。
bash で試してください:
echo ^[[33;1mcolored.^[[0mnot colored.
これは、 ANSIエスケープシーケンス, 、2つを挿入します ^[
経由 CTRLvESC.
あなたも試してみてください CTRLvCTRLメートル入力, 、これは次のようになります:
bash: $'\r': command not found
覚えておいてください \r
上から?:>
これ ASCII 制御文字 リストは完全なものとは異なります ASCII記号表, 、制御文字は、 CTRL キー(笑)、そこにあります。一方、C や他のほとんどの言語では、通常、これらの「文字」を表すために 8 進コードを使用します。
これがどこから来たのかを本当に知りたい場合は、次のようにします。 http://www.linusakesson.net/programming/tty/.
これは、このトピックに関して見つけることができる最良のリンクですが、次の点に注意してください。ドラゴンもいるよ。
TL;DR
いつもの foo
= \n
, 、 そして bar
= \r
.
使用する必要があります
:%s/,/^M/g
を入手するには、 ^M
文字、押します Ctrl v に続く 入力
\r
ここで作業を行うことができます。
Windows 上の Vim で使用する Ctrl+Q 代わりに Ctrl+V
これは私の考え方としては最良の答えですが、表にするともっと良くなるでしょう。 https://stackoverflow.com/a/12389839/962394.
つまり、言い換えると次のようになります。
使用する必要があります \r
改行を使用するには (ascii 0x0a
, 、unix 改行) を正規表現置換に使用しますが、これは置換に特有のものです。通常は引き続き使用することを想定する必要があります。 \n
改行と \r
キャリッジリターン用。
これはvimが使用したためです \n
NIL 文字 (ASCII) を意味する置換で 0x00
)。NIL が次のようになることを期待していたかもしれません。 \0
代わりに、解放する \n
通常は改行に使用しますが、 \0
は正規表現置換ですでに意味を持っているため、次のように変更されました。 \n
. 。したがって、さらに進んで、改行も次からシフトします \n
に \r
(正規表現パターンではキャリッジ リターン文字、ASCII です。 0x0d
).
character | ascii code | C representation | regex match | regex replacement -------------------------+------------+------------------+-------------+------------------------ nil | 0x00 | \0 | \0 | \n line feed (unix newline) | 0x0a | \n | \n | \r carriage return | 0x0d | \r | \r | <unknown>
注意: ^M
(LinuxではCtrl-V Ctrl-M)他の人がアドバイスしたように、正規表現の置換で使用すると、キャリッジリターンではなく改行が挿入されます(私は試してみました)。
また、vim はファイル形式設定に基づいてファイルに保存するときに改行文字を変換するため、問題が混乱する可能性があることにも注意してください。
日食からは、 ^M
行内に文字を埋め込むことができ、それらを改行に変換したい場合。
:s/\r/\r/g
しかし、置き換える必要がある場合は、次のことが機能します
:%s/\n/\r\|\-\r/g
上記では、次の行はすべて次の行、次に |-、そして再び次の行に置き換えられます。これは wiki テーブルで使用されます。テキストが次の場合:
line1
line2
line3
に変更されます
line1
|-
line2
|-
line3
ファイル全体に対して実行する必要がある場合は、コマンドラインから試行できることも提案されました
sed 's/\\n/\n/g' file > newfile
これが私にとってうまくいった答えです。この男から
----引用 http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/
他にやらなければならないことがあるのに思い出せず、調べなければなりません。
vi で検索と置換で改行文字を挿入するには、次の手順を実行します。
:%s/look_for/zerpith_with^m/g上記のコマンドは、「look_for」のすべてのインスタンスを「leplage_with n」に置き換えます( nを意味するnewline)
「^M」を取得するには、キーの組み合わせ「ctl-V」を入力し、その後(すべてのキーを放して)「enter」キーを押します。