,
現在のファイルのそれぞれを新しい行に置き換えようとしています:
:%s/,/\n/g
^@
ただし、実際の改行ではなく、のように見えるものが挿入されます。ファイルはDOSモードなどではありません。
私は何をすべきか?
私のように興味がある場合は、質問を確認してください。同じように。
\r
の代わりに使用し\n
ます。で置き換えると\n
、テキストにヌル文字が挿入されます。改行を取得するには、 を使用します\r
。ただし、改行を検索するときは\n
、引き続き を使用します。この非対称性は、とがわずかに異なること\n
を行うという事実によるものです。\r
\n
行末 (改行) に\r
一致しますが、キャリッジ リターンに一致します。一方、 in \n
replacements はヌル文字を\r
挿入しますが、 は改行を挿入します (より正確には、 input として扱われます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
文字を取得するには、 Ctrl+Vを入力して を押しEnterます。Windows では、Ctrl+ Q, Enter. これらを思い出す唯一の方法は、それらがどれほど意味をなさないかを思い出すことです。
A:改行を表すために使用する最悪の制御文字は何ですか?
B: (通常は「Quit」を意味するため) または、誤って+を入力してエディターを強制終了しやすいためです。
q
v
CtrlCA:そうしてください。
構文s/foo/bar
の\r
と\n
は、コンテキストに応じて異なる意味を持ちます。
の場合foo
:
\r
== 「改行」 ( CR
/ ^M
) == Linux/Mac およびWindows では
\n
「改行」 ( ) に一致します。LF
CRLF
の場合bar
:
\r
== LF
Linux/Mac では生成、 CRLF
Windows では
\n
== "null byte" ( NUL
/ ^@
)
最初に Windows 環境で作成され、アップロードされたファイル (つまり、Web サーバー上) を Linux で編集する場合 (つまり、FTP/SFTP) - ^M
vim で表示されるすべての は、CR
Linux でのみ使用されるため変換されない です。LF
は改行を表します。
NUL
== 0x00 == 0 == Ctrl+ @== ^@
vim で表示
LF
== 0x0A == 10 == Ctrl+ J
CR
== 0x0D == 13 == Ctrl+ M== ^M
vim で表示
以下は、ASCII 制御文字のリストです。Ctrl+ V、Ctrl+を介して Vim に挿入します---key---。
Bash またはその他の Unix/Linux シェルでは、Ctrl+と入力するだけ---key---です。
Bash でCtrl+を試してください。Linux システムでは行区切りに改行が使用されますが、シェルは意味を理解するため、 をM押すのと同じです。Enter
リテラルを bash に挿入するには、先頭にCtrl+Vを付けることもできます。
Bashで試してください:
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 の謎を解き明かす. これは、このトピックについて遭遇する最良のリンクですが、注意してください: ドラゴンがいます.
TL;DR
通常foo
= \n
、およびbar
= \r
。
以下を使用する必要があります。
:%s/,/^M/g
文字を取得するには、 +に続いて^M
を押します。CtrlvEnter
\r
あなたのためにここで仕事をすることができます。
Windows 上の Vim では、Ctrl+Qの代わりにCtrl+を使用しますV。
これが私の考える最良の答えですが、表にするともっと良かったでしょう。
したがって、言い換えると:
正規表現の置換で改行\r
(ASCII 、Unix の改行)を使用する必要がありますが、これは置換に特有のものです。0x0A
\n
\r
これは、Vim\n
が代わりに NIL 文字 (ASCII 0x00
) を意味するために使用したためです。代わりにNIL があり、改行の通常の使用のため\0
に解放されていると予想していたかもしれませんが、正規表現の置換ではすでに意味があるため、にシフトされました。したがって、さらに改行を からにシフトします(これは、正規表現パターンではキャリッジリターン文字 ASCIIです)。\n
\0
\n
\n
\r
0x0D
キャラクター | アスキーコード | C表現 | 正規表現一致 | 正規表現の置き換え --------------+------------+----------------------- -------+-------------+------------------------ なし | 0x00 | \0 | \0 | \n 改行 (Unix 改行) | 0x0a | \n | \n | \r キャリッジリターン | 0x0d | \r | \r | <不明>
NB: ^M
( Linux ではCtrl+ V Ctrl+ M) は、他の人がアドバイスしているように、キャリッジ リターンではなく、正規表現の置換で使用すると改行を挿入します (試してみました)。
また、Vim はファイル形式の設定に基づいてファイルに保存するときに改行文字を変換するため、問題が混乱する可能性があることに注意してください。
Eclipseから、^M
文字を行に埋め込むことができ、それらを改行に変換したいと考えています。
:s/\r/\r/g
しかし、代用する必要がある場合は、次のことが機能します。
:%s/\n/\r\|\-\r/g
上記では、次のすべての行が次の行に置き換えられ、さらに|-
新しい行に置き換えられます。これは wiki テーブルで使用されます。
テキストが次のような場合:
line1
line2
line3
に変更されます
line1
|-
line2
|-
line3
これが私のために働いた答えです。この男 より:
----quoting vi エディターを使用して、replace に改行文字を挿入します。
私がしなければならない他の何かが思い出せず、調べなければなりません。
vi で、検索と置換に改行文字を挿入するには、次の手順を実行します。
:%s/look_for/replace_with^M/g
上記のコマンドは、「look_for」のすべてのインスタンスを「replace_with\n」に置き換えます (\n は改行を意味します)。
「^M」を取得するには、キーの組み合わせCtrl+Vを入力し、その後 (すべてのキーを放して) キーを押しEnterます。
ファイル全体に対してそれを行う必要がある場合は、コマンドラインから試すことも提案されました。
sed 's/\\n/\n/g' file > newfile