如何将^ M换行转换为在vim中打开的文件中的“正常”换行符?
vim在每行结尾^ M显示
我如何用“正常”换行符取代这个?
命令
:%s/<Ctrl-V><Ctrl-M>/\r/g
其中<Ctrl-V><Ctrl-M>
表示键入Ctrl + V,然后Ctrl + M。
说明
:%s
替代,%=所有行
<Ctrl-V><Ctrl-M>
^ M字符(Ctrl-V是写入Ctrl ^字符的Vim方式,Ctrl-M写入正则expression式后的M,导致^ M特殊字符)
/\r/
用新行( \r
)
g
并在全球范围内进行(不只是第一次出现在线上)。
在Linux和Mac OS上,以下工作,
:%s/^V^M/^V^M/g
其中^V^M
表示键入Ctrl + V ,然后Ctrl + M。
注意:在Windows上,您可能要使用^Q
而不是^V
,因为默认情况下^V
被映射为粘贴文本。
在vim
,看一下文件格式 – DOS或者Unix:
:set filetype=unix
:set fileformat=unix
该文件将被写回无回车(CR,^ M)字符。
在MacVim中看到的一个用BBEdit创build的文件显示了一堆^M
行返回,而不是常规的返回。 下面的stringreplace解决了这个问题 – 希望这有助于:
:%s/\r/\r/g
这很有趣,因为我用相同的字符replace换行符,但是我认为Vim只需要得到一个新的\ r来正确显示。 我有兴趣知道为什么这个工程的基本机制。
首先,使用:set ff?
找出你的文件的文件格式。
我猜这可能是unix
,那么问题是你的文件是用fileformat=dos
在行结尾添加“^ M ^ J”而创build的,但是只读取flieformat=unix
只从行结尾删除“^ J”,留下那里有“^ M”。
只需input:e ++ff=dos
在Vim命令行中将您的文件格式从unix更改为dos。 它应该解决这个问题。 如果没有, :%s/\r//g
应该帮助你。
为了得到^ M字符匹配我不得不直观地select它,然后使用操作系统复制到剪贴板命令来检索它。 在尝试replace命令之前,可以通过search字符来testing它。
/^M
应该select第一个坏的路线
:%s/^M/\r/g
将用回车replace所有错误的^ M。
这是基于gvim 7的MacVim中的function。
编辑:
这个问题再次发生在我的Windows 10机器上,这个机器上有Ubuntu for Windows,我认为这是vim引起的文件格式问题。 在这种情况下,将ff更改为unix,mac或dos只会将^ M更改为^ J并再次返回。
在这种情况下的解决scheme:
:%s/\r$/ /g :%s/ $//g
我走这条路的原因是因为我想确保我对我的文件没有破坏性。 我可以有:%s/\r$//g
但这会删除回车右键,并可能有意想不到的结果。 相反,我们将单个的CR字符(这里是一个^ M字符)转换成一个空格,然后删除行末尾的所有空格(对我而言,这是一个理想的结果)
很抱歉,我们已经回答了一个早已被回答的旧问题,但似乎有一些困惑正在进行,我想我会帮助清理一些问题,因为这在谷歌search中已经达到高潮。
这些都没有为我工作,所以我试了这个,工作:
键入:%s/
按CTRL-V CTRL-M
键入//g
按Enter键
因此,Vim中的总体命令如下所示:%s/^M//g
这是什么:%s
(查找和replace) /^M/
(那个符号) /
(没有字符) g
(全局)。
无需使用Ctrl:: :%s/\r$//
简单的事情,为我工作
dos2unix filename
那么只是:: :%s/\r//g
这完全为我工作。
这样做只是为了清除所有行的行尾,删除了^ M,就是这样。
我用sed做了这个:
sed -i -e 's/\r/\n/g' filename
^ M通过Ctrl + V和M检索,所以可以
s/^M//g
Ctrl + M最小化我的窗口,但Ctrl + Enter实际上插入一个^M
字符。 我也必须确保在两次按下之间不要松开Ctrl键。
所以我的解决scheme是:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
其中<Ctrl-V><Ctrl-Enter>
表示按住 Ctrl ,按下并释放V ,按下并释放Enter , 然后释放 Ctrl 。
如果您正在处理Windows生成的文件
上面的解决scheme将在现有的行之间添加一行,因为^M
之后已经有一个不可见的\r
。
为了防止这种情况,您希望删除^M
字符而不需要replace它们。
:%s/<Ctrl-V><Ctrl-Enter>//g
其中%
表示“在这个缓冲区中” s
意思是“替代”, /
意味着“(find)下面的模式,” <Ctrl-V><Ctrl-Enter>
指的是按键来获得^M
字符上面), //
意思是“没有任何东西”(或者,“这两个斜杠之间的模式是空的”), g
是一个标志,意思是“全局的”,而不是一行中的第一个出现。
另外,还有一些开源工具叫做dos2unix和unix2dos,可以做到这一点。 在Linux系统上,它们可能是默认安装的; 对于Windows系统,您可以从http://www.bastet.com/下载它们。;
就我而言,
上面没有任何工作,我有一个CSV文件从我的Mac复制到Linux机器,我用上述所有命令,但没有任何帮助,但下面的一个
tr "\015" "\n" < inputfile > outputfile
我有一个文件,其中^ M个字符夹在两行之间,如下图所示
Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
对于这个问题还有很多其他的答案,但是,我仍然需要一个命令行解决scheme:
vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -cq myfile
说明:
- 如果不加载任何.vimrc文件,请打开
myfile
- 运行
:e ++ff=dos
强制重新加载整个文件作为dos行尾。 - 运行
:w ++ff=unix
使用unix行结尾写入文件 - 退出vim
如果文件是在Windows上创build的,请使用dos2unix实用程序,如果文件是在mac上创build的,请使用mac2unix实用程序。 🙂
这对我工作:
- 设置文件格式为unix(
\n
行尾) - 保存文件
所以在vim中:
:set ff=unix :w
sed s/^M//g file1.txt > file2.txt
通过同时按下3个键ctrl + v + m键入^ M
这对我工作:
:% s/\r\n/\r
为了节省击键 ,您可以避免在一个映射中inputCtrl + V Ctrl + M。 只需打开一个包含^ M字符的文件,就可以将其拖到.vimrc中,并粘贴到这样一行:
nnoremap <Leader>d :%s/^M//g<CR>
这些build议没有任何工作为我已经设法得到一个负载的^M
线换行符与VIM和日食工作。 我怀疑我遇到了一个外部案件,但如果它帮助我做了任何人。
:%s/.$//g
它整理了我的问题
:g/^M/s// /g
如果您使用Shift+6 Caps+M
键入^M
,则不会接受。
你需要inputctrl+v ctrl+m
。
我知道这可能太老了,但希望有人能find这个有用的。
使用这些命令:
:%s/\r//g
要么
:%s/\r\(\n\)/\1/g
^M
给不需要的换行符。 为了处理这个问题,我们可以使用sed
命令,如下所示:
sed 's/\r//g'
只要在您的.vimrc中删除set binary
!
“这个function保留了跳转列表
fun! Dos2unixFunction() let _s=@/ let l = line(".") let c = col(".") try set ff=unix w! "%s/\%x0d$//e catch /E32:/ echo "Sorry, the file is not saved." endtry let @/=_s call cursor(l, c) endfun com! Dos2Unix keepjumps call Dos2unixFunction()
我花了一个下午努力\ n ctrl-V 012(这两个都提供了空值)。 通过这个线程,直到我达到metagrapher的。
\r
为我工作得很好!
/),/s/),/)\r/g
变成这样的东西:
黑名单 – 额外:i386(0.4.1,0.4.1 + nmu1),libmount1:i386(2.20.1-5.1,2.20.1-5.2),libblkid1:i386(2.20.1-5.1,2.20.1-5.2) ,libapt-pkg4.12:i386(0.9.7.4,0.9.7.5),nmap:i386(6.00-0.1,6.00-0.2),libsane-common:i386(1.0.22-7.3,
成这样的东西:
26 libwv-1.2-4:i386(1.2.9-3,自动)
27 openjdk-6-jre-headless:i386(6b24-1.11.4-3,自动)
28日:i386(0.99.19-2.1)
魔法。 我非常感激
或者不使用vim,你可以使用这个命令修复换行符
fromdos <filename.txt>
希望它有帮助!