,
現在のファイルのそれぞれを新しい行に置き換えようとしています:
:%s/,/\n/g
しかし、それ^@
は実際の改行の代わりにのように見えるものを挿入します。ファイルはDOSモードまたはその他のものではありません。
私は何をすべきか?
興味があれば、私のように、なぜVraの\ ra newlineはなぜですか?同様に。
,
現在のファイルのそれぞれを新しい行に置き換えようとしています:
:%s/,/\n/g
しかし、それ^@
は実際の改行の代わりにのように見えるものを挿入します。ファイルはDOSモードまたはその他のものではありません。
私は何をすべきか?
興味があれば、私のように、なぜVraの\ ra newlineはなぜですか?同様に。
回答:
\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を挿入しました。
\r
このように機能しません。しかしCtrl-V
Enter
、タイピングの代わりにを押すことができ\r
、それは機能します。
\r
挿入<CR>
および\n
挿入する場合、何かをキャリッジリターンで置き換えるにはどうすればよいですか?
ここにトリックがあります:
最初に、Vi(m)セッションを設定して、特殊文字(つまり、改行)とのパターンマッチングを許可します。おそらくこの行を.vimrcまたは.exrcファイルに入れる価値があります。
:set magic
次に、次を実行します。
:s/,/,^M/g
^M
文字を取得するには、Ctrl+ Vを入力してを押しEnterます。Windowsでは、行いますCtrl+ Q、Enter。私がこれらを覚えている唯一の方法は、彼らがどれほど意味をなさないかを覚えることです。
A:改行を表すために使用する最悪の制御文字は何ですか?
B:どちらか
q
(それは通常意味するので、「終了」)、またはv
それはそう簡単に入力することですので、Ctrl+ C誤って、エディタを殺します。A:そうしてください。
:set magic
(〜/ _vimrcにもありません)もも必要ありませんctrl-q
。単純なctrl-v
後にエンターを^M
押すだけで、私のキャラクターがうまく作成されます。
Ctrl-C
エディタを強制終了することはありませんが、通常モードに戻ることはできます。Ctrl-V
逐語的をCtrl-Q
意味し、誰かが$VIMRUNTIME/mswin.vim
設定ファイルのロードを間違えたことを意味します。mswinは必要ありません。代わりに独自のvimrcを使用してください。
sed -n l
今まではやっていました。同じことがCtrl-v
vim でも実現できることを知っておくと役に立ちます。
構文ではs/foo/bar
、\r
および\n
コンテキストに応じて、異なる意味を持っています。
の場合foo
:
\ n =改行(Linux / MacではLF、WindowsではCR + LF)
\ r =改行(CR)
の場合bar
:
\ r =は改行です
\ n = nullバイト。
NUL
= 0x00 = 0 = Ctrl+ @
LF
= 0x0A = 10 = Ctrl+ J
CR
= 0x0D = 13 = Ctrl+M
以下は、ASCII制御文字のリストです。Ctrl+ V、Ctrl+ を使用してVimに挿入します---key---。
Bashまたは他のUnix / Linuxシェルでは、単にCtrl+と入力し---key---ます。
BashでCtrl+ Mを試してください。EnterLinuxシステムでは行区切りに改行が使用されていますが、シェルは意味を理解しているため、を押すのと同じです。
リテラルをbashに挿入するには、前にCtrl+ Vを付けることもできます。
バッシュで試してください:
echo ^[[33;1mcolored.^[[0mnot colored.
これはANSIエスケープシーケンスを使用します。2挿入^[
経由さんをCtrl+ V、Esc。
Ctrl+ V、Ctrl+ M、も試してみてくださいEnter:
bash: $'\r': command not found
\r
上から覚えていますか?:>
このASCII制御文字リストは、完全なASCIIシンボルテーブルとは異なります。制御文字は、Ctrlキー(ハハ)を介してコンソール/疑似端末/ Vimに挿入され、そこにあります。
Cおよび他のほとんどの言語では、通常、これらの「文字」を表すために8進コードを使用します。
これがどこから来たのかを本当に知りたい場合:TTY demystified。これは、このトピックについて遭遇する最良のリンクですが、注意してください。ドラゴンがいる。
TL; DR
通常foo
= \n
、およびbar
= \r
。
:s/x/^M/g
を実行する必要があります。^M
ビアのctrl-v
後にを挿入しctrl-m
ます。
使用する必要があります:
:%s/,/^M/g
取得するには^M
、文字を、プレスCtrl+がv続きますEnter。
これは私が考える方法に対する最良の答えですが、表ではより優れていたでしょう。
言い換えれば、
正規表現の置換で\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はファイル形式の設定に基づいてファイルに保存するときに改行文字を変換するため、問題が発生する可能性があることに注意してください。
以下からのEclipse、^M
文字が行に埋め込むことができます。また、改行に変換します。
:s/\r/\r/g
ファイル全体に対して実行する必要がある場合は、コマンドラインから試すこともできます。
sed 's/\\n/\n/g' file > newfile
printf 'foo\\nbar\n' | sed 's/\\n/\n/g'
、それはあなたのシステム上で動作するかどうかを確認します。(この提案については、フリーノードの#bashの善良な人々にクレジットを提供してください。)
ここで私のために働いた答えがあります。この男から:
----引用viエディターを使用して、置換に改行文字を挿入します
他に何かしなければならないこと、覚えていないこと、そして調べなければならないこと。
viでは、検索と置換に改行文字を挿入するには、次のようにします。
:%s/look_for/replace_with^M/g
上記のコマンドは、「look_for」のすべてのインスタンスを「replace_with \ n」に置き換えます(\ nは改行を意味します)。
「^ M」を取得するには、キーの組み合わせCtrl+を入力し、Vその後(すべてのキーを離して)キーを押しEnterます。