我试图用一行新行替换当前文件中的每个,:
但它插入了看起来像^@的内容,而不是实际的换行。文件不在DOS模式或其他模式下。
我该怎么办?
如果您和我一样好奇,请检查问题:为什么为vim添加新行?也。
- 堆栈溢出是一个用于编程和开发问题的站点。这个问题似乎是一个偏离主题的问题,因为它与编程或开发无关。在帮助中心查看我可以询问哪些主题。也许超级用户或Unix&Linux堆栈交换会是更好的选择。
- @JWW这个问题已经10年了…似乎太老了不能迁移。有很多这样的问题,例如:stackoverflow.com/questions/10175812/…
- @JWVIM是程序员常用的一种工具,关于程序员常用的工具的问题是关于栈溢出的主题。尽管很明显这在vi和vim上更合适。
用
代替
。
用
替换将在文本中插入一个空字符。要获得新线,请使用
。然而,在搜索新行时,您仍然可以使用
。这种不对称是由于
和
做的事情略有不同:
匹配行尾(换行),而
匹配回车。另一方面,在替换中,
插入一个空字符,而
插入一个换行符(更准确地说,它被视为输入)。下面是一个小的、非交互式的示例,通过使用VIM命令行功能来说明这一点(换句话说,您可以将以下内容复制并粘贴到终端中以运行它)。xxd显示结果文件的十六进制转储。
1 2 3 4 5 6 7
| echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/
/' '+s/a/
/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt |
1 2 3 4
| Before:
0000000: 6261 720a bar.
After:
0000000: 000a 720a ..r. |
换句话说,
已将字节0x00插入文本;
已插入字节0x0a。
- 为什么这样做?
- /R被视为按下回车键。它适用于所有平台。
- 无论出于什么原因,用","替换所有的'在执行时都有效:%s/'/',
/g
- 另请参见为什么
是vim的新行?.
- 我希望这对AIXV6.1上的Classic VI有效,
并不是这样工作的。但是你可以按Ctrl-VEnter来代替输入
来工作。
- 即使这样,V型后接M型,保持控制键,看起来像这个^M,可以用它代替
或
- 为什么
是vim的新行?哈哈哈。
- 我参加聚会迟到了。如果
插入和
插入一个空值,我该如何用回车替换?
- @Konradrudolph:很久以前,当人们使用电传打字机时,在计算机之前,当你到达行尾时,需要插入两个字符,打印头才能从最右向左到达,开始一个新行。因此,如果在头部从右向左移动时有任何字符出现,它就会丢失。为了解决这个问题,人们插入了回车(CR)和换行(LF)。在降低打印头移动速度后,不同的人选择不同的路径-unix使用lf,dos使用cr和lf,apple使用cr。
- 因此,为了保持兼容性,当文件以ASCII格式打开时,DOS会删除CR,当文件以二进制格式打开时,两者都会删除。我不知道这为什么在Unix中是一个问题,但这可能也有一些类似的怪癖。
- @Sunil我知道不同系统中的回车和换行的历史;但是,它并不能解释
和
在搜索和替换时意义的不对称性。
- 有趣的是,我必须回去:%s/
/,/g,而不是%s/
/,/g。
- 这个答案从stackoverflow.com/revisions/71334/1开始就一直存在。
- @你确定CR和LF的历史吗?我觉得原来如果向前移动一行纸,但没有移动打印头,CR移动打印头但没有移动纸张。因此,如果您的操作系统在打印前没有转换输入,您就不能仅使用LF或CR来获得正确的输出。MS DOS使用原始打印机数据作为文本文件格式,Mac OS使用CR并将其转换为打印机的原始格式,Unix使用LF并将其转换为打印机的原始格式。
- 我有一行很长,包含了很多明确的",我想把它们扩展到每一行。看完这篇文章后,江户十一〔11〕耍了个花招!(注意额外的,否则它会搜索实际的换行符)
- 实际上,我总是这样做::%s/text/^M/g,我只需按^V,进入第二部分。希望能帮助别人
诀窍如下:
首先,将vi(m)会话设置为允许模式匹配特殊字符(即:换行符)。将这一行放入.vimrc或.exrc文件中可能是值得的。
下一步,做:
要获取^M字符,请键入control v,然后单击enter。在Windows下,执行control q、enter。我唯一能记住这些的方法就是记住它们的意义有多小:
A: What would be the worst control-character to use to represent a newline?
B: Either q (because it usually means"Quit") or v because it would be so easy to type Control-c by mistake and kill the editor.
A: Make it so.
- 我在Windows上使用gvim,我既不需要:set magic(它也不在我的vimrc中)也不需要ctrl-q。只是一个简单的Ctrl-V后跟enter,就可以为我创建^M字符。
- C-V不表示换行符;它是"escape next literal character"命令。我也不知道C-V是什么助记符,但它在心理上并没有映射到新线是有原因的。
- ctrl-v是一个"逐字"的助记键,也就是说,按一下escape next键进入它的"逐字"键代码/字符。在Windows中,它是粘贴的:使事物熟悉。ctrl-q可能用于"(un)引号"。很愚蠢,不管怎样-但是你可以在二进制文件中使用它-例如,通过ctrl-z搜索ctrl-a(我猜是ascii 1-26)。
- 现在我要删除多余的","这个命令介绍了…
- Ctrl-C实际上并不杀死编辑器,尽管它可以取消您回到正常模式。Ctrl-V表示逐字,Ctrl-Q表示有人错误地加载了$VIMRUNTIME/mswin.vim配置文件。你不需要Mswin。用你自己的VIMRC代替。
在语法和s/foo/bar
有不同的意义,取决于上下文。
短:
为foo:
换行(LF)在Linux / Mac的Windows下的CRLF)
R =回车(CR)
为bar:
R =是换行
n = 0字节。
气味:(与ASCII码号码)
NUL==0=0x00 ctrl @
LF==10=0x0a ctrlj
CR= = = ctrlm 0x0d 13
这里是列表中的ASCII控制字符,插入他们在vim密钥通过ctrlvctrl————。
在bash或其他UNIX / Linux的shell只是ctrl型————密钥。尝试ctrlm在bash中,其enter相同的AS,AS realizes壳是什么意思,即使使用Linux系统的delimiting饲料行线。
要插入文字的prepending bash,所以他们有ctrlv想工作。
在bash:try
1
| echo ^[[33;1mcolored.^[[0mnot colored. |
本使用ANSI转义序列,通过插入两ctrlvesc ^[吗。
所以你可能想尝试ctrlvctrlmenter,这给你。
1 2
| bash: $'
': command not found |
从以上
记得吗?:>
这是一个ASCII控制字符列表从一个完整的ASCII符号表不同,它是控制字符,这是插入A控制台/假顶生)以ctrl密钥(哈哈),我们可以找到。而在C和其他语言,你都必须使用八进制码到论文的代表人物。
如果你真的想知道这是来自:http:/ / / / / www.linusakesson.net编程tty(终端)。
这是最好的链接,你会在关于这个主题,但注意:有龙。
铊;博士
通常foo
和bar
=,=。
- 所以我很好奇你怎么用回车代替一个角色
- @电码射击:s/x/^M/g应该可以。通过Ctrl-V插入^M,然后插入ctrl-m。
- 谢谢Sjas,你知道这个问题是有史以来最奇怪的问题之一。1008张选票支持这个答案,基本上只说"Vim做了你发现的事情"。那是因为维姆做了你发现的事。永远不要忘记Vim做了你发现的事情。"我希望能找到一个简短的代码列表,列出模式中有趣的字符、替换和奇怪的原因,这样它就容易记住和预测其他类似的奇怪。那会得到我的选票的。
- @代码截图一个ASCII控制字符列表可能对您有所帮助。请参阅cs.tut.fi/~jkorpela/chars/c0.html以获取进一步参考。我将更新我的答案以包含两个链接。
你需要使用
要获取^M字符,请按ctrl v,然后按enter。
可以在这里为您工作。
在Windows上使用VIM时,使用CtrL+Q代替CtrL+VbkBD
这是最好的方式,我认为答案是,但它会是更好的在一个表:http:/ / / / 12389839 stackoverflow.com 962394。
因此,rewording:
你需要使用
to use a换行(ASCII 0x0a,UNIX换行)正则表达式替换,但这是一个独特的替代都认为你应该继续使用
for for换行和回车。
这是因为在一个
VIM使用替换的字符(ASCII 0x00尼罗河均值)。你可能已经有一个好的\0尼罗河,释放其正常使用的
换行,但已经有一\0正则表达式的意义在什么replacements所以它移到
。因此,要继续到"换行和
因此移到
(这是a正则表达式模式中0x0d回车字符,ASCII)。
1 2 3 4 5 6 7 8 9 10
| character | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil | 0x00 | \0 | \0 |
line feed (unix newline) | 0x0a |
|
|
carriage return | 0x0d |
|
| <unknown> |
注:^M(按Ctrl - V M a当插入换行符在Linux)中使用的正则表达式替换,而比别人有我As a回车(我想它)。
所以要注意翻译的Vim换行字符特殊文件时,它是基于其文件格式可以设置和工业问题。
在Eclipse中,^M字符可以嵌入到一行中,并且您希望将它们转换为换行符。
但是如果必须替换,那么下面的事情就可以了
在上面,每一行都被下一行替换,然后-再替换下一行。这在wiki表中使用。如果文本如下:
改为
1 2 3 4 5
| line1
|-
line2
|-
line3 |
如果你需要做一个完整的文件,它也建议我,你可以尝试从命令行
1 2 3
| sed 's/\
/
/g' file > newfile |
- 请注意,这需要GNU SED。试试printf 'foo\
bar
' | sed 's/\
/
/g'看看它是否能在你的系统上工作。(这一建议归功于bash on freenode的好人。)
这是对我有用的答案。从这个家伙
——引用http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/
我还得做一些我记不起来的事,然后再去看看。
在vi中,要在搜索和替换中插入换行符,请执行以下操作:
:%s/查找/替换为^m/g上面的命令将"look"的所有实例替换为"replace"with (with 表示换行)
若要获得"^m",请输入组合键"ctl-v",然后(释放所有键)按"Enter"键。