with - vim replace word all




如何在Vim中用換行符替換一個字符? (8)

我試圖用新行替換當前文件中的每個文件:

:%s/,/\n/g 

但它會插入看起來像^@而不是實際換行符。 該文件不在DOS模式或任何東西。

我該怎麼辦?

如果你很好奇,像我一樣,檢查問題為什麼對於Vim而言,\ ra是新行? 以及。


使用\r而不是\n

\n代替,在文本中插入一個空字符。 要獲得換行符,請使用\r 。 但是,在搜索換行符時,仍然會使用\n 。 這種不對稱是由於\n\r 做了些微不同的事情

\n匹配換行符(換行符),而\r匹配回車符。 另一方面,在替換中, \n插入一個空字符,而\r插入一個換行符(更準確地說,它被視為輸入<CR> )。 下面是一個小的非交互式示例,用於說明這一點,使用Vim命令行功能(換句話說,您可以將以下內容複製並粘貼到終端中運行)。 xxd顯示結果文件的hexdump。

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可以在這里為你做這項工作。


但是,如果一個人不得不替代,那麼下面的東西是可行

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

在上面的每一行中都被下一行代替,然後| - 再次代表下一行。 這用於維基表格中。 如果文字如下:

line1
line2
line3

改為

line1
|-
line2
|-
line3

你需要使用

:%s/,/^M/g

要獲得^M字符,請按Ctrl v,然後按Enter


在日食中, ^M字符可以嵌入一行,並且您想將它們轉換為換行符。

:s/\r/\r/g

在語法s/foo/bar \r\n有不同的含義,具體取決於上下文。

對於foo
\ n =換行符
\ r = CR(回車= Ctrl-M = ^ M)

對於bar
\ r =是換行符
\ n =空字節(0x00)。

過去我經常看到有關這些東西的問題,而在未來的某個時候,幾乎沒有人會最終知道這些東西......

按照'流行'的要求:

這裡是ASCII控製字符的列表,通過CTRL v CTRL --- key ---vim插入它們。
bash或其他unix / linux shell中,只需鍵入CTRL --- key --- 。 在bash中嘗試CTRL M ,與敲入ENTER相同,因為shell意識到了這一點,儘管Linux系統使用換行符進行行分隔。 只有線進給的控製字符是CTRL-A ,它在bash中綁定到'跳到行首“。

要在bash中插入文字, CTRL v也可以工作。

嘗試在bash中:

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

這使用ANSI轉義序列 ,通過CTRL v ESC插入兩個^[ 's。

你也可以嘗試CTRL CTRL m ENTER ,它會給你這個:

bash: $'\r': command not found

記住從上面的\r ? :>

ASCII控製字符列表與標準的ASCII符號表不同,因為通過CTRL鍵(haha)可以在控製字符/偽終端/ vim中插入控製字符。 而在C和大多數其他語言中,通常使用八進制代碼來表示這些“字符”。

如果你真的想知道這些來自哪裡: http://www.linusakesson.net/programming/tty/ : http://www.linusakesson.net/programming/tty/
這是你會遇到關於這個話題的最好的鏈接,但要小心:有龍。

TL; DR

通常foo = \nbar = \r


訣竅是:

首先,設置你的vi(m)會話以允許與特殊字符(即:換行符)進行模式匹配。 這可能值得放在.vimrc或.exrc文件中。

:set magic

接下來,執行:

:s/,/,^M/g

要獲得^M字符,請鍵入Control - v並按Enter鍵 。 在Windows下,執行Control - qEnter 。 我能記住這些的唯一方法就是記住他們的感覺有多麼微不足道:

A:用什麼來代表換行符是最差的控製字符?

B: 或者q (因為它通常意味著“退出”)或者v因為錯誤地輸入Control - c會很容易並且殺死編輯器。

答: 做到這一點。


這是我認為的最佳答案,但在表格中它會更好: https://.com/a/12389839/962394 : https://.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 (Ctrl-V在linux上的Ctrl-M)在正則表達式替換中插入一個換行符,而不是像其他人所建議的那樣(我剛剛嘗試過)插入換行符。

還要注意的是,當vim根據文件格式設置將文件保存到文件時,它會轉換換行符,這可能會引起混淆。





vi