提问人:Bert Hekman 提问时间:9/17/2008 最后编辑:HenkeBert Hekman 更新时间:10/25/2023 访问量:685978
在 Vim 中将 DOS/Windows 行尾转换为 Linux 行尾
Convert DOS/Windows line endings to Linux line endings in Vim
答:
:%s/\r\+//g
在 Vim 中,它剥离了所有回车符,只留下换行符。
评论
:%s/\r//g
:g/Ctrl-v Ctrl-m/s///
CtrlM是 DOS 行尾添加的字符或回车符。 告诉 Vim 在命令行中插入一个文字字符。\r
CtrlVCtrlM
从整体上看,此命令将所有内容替换为“无”,并将它们从行尾删除。\r
评论
dos2unix 是一个命令行实用程序,可以做到这一点。
在 Vim 中,如果您使用 - - 输入 ^M(在 Windows 上,请改用 - )。:%s/^M//g
CtrlvCtrlmCtrlq Ctrl-m
如果文件以 (Windows) 文件格式加载,Vim 可能不会显示字符。在这种情况下,你可以,然后用 或 保存文件,Vim 会在为你保存文件时重新格式化文件。^M
dos
:set ff=unix
:w
:w!
有关于文件格式设置的文档,Vim wiki 有一个关于行尾转换的综合页面。
或者,如果你经常来回移动文件,你可能不想转换它们,而是这样做,这样 Vim 就会知道它是一个 DOS 文件,并使用 DOS 约定作为行尾。:set ff=dos
评论
:%s/^M//g
应该是,因为只是表示“匹配行首的大写字母”M”。:%s/\r//g
^M
:%s/\r//g
set ff=unix
您可以使用以下命令:
其中“^”表示使用键。:%s/^V^M//g
CTRL
使用以下命令:
:%s/^M$//g
若要显示 ,请键入 ,然后键入 。 告诉 Vim 按字面意思输入下一个字符。^M
CtrlVCtrlMCtrlV
发件人:文件格式
[Esc] :%s/\r$//
评论
我更喜欢使用以下命令:
:set fileformat=unix
您还可以使用或分别将文件转换为 Mac 或 MS-DOS/Windows 文件约定。如果文件已经采用正确的格式,它什么都不做。mac
dos
有关更多信息,请参阅 Vim 帮助:
:help fileformat
评论
^M
set fileformat=unix
:set fileformat=unix
从 DOS 转换为 Unix。
评论
更改视图中的行尾:
:e ++ff=dos
:e ++ff=mac
:e ++ff=unix
这也可以用作保存操作(仅使用 :w 不会使用您在屏幕上看到的行尾进行保存):
:w ++ff=dos
:w ++ff=mac
:w ++ff=unix
您可以从命令行使用它:
for file in *.cpp
do
vi +':w ++ff=unix' +':q' "$file"
done
评论
:w +ff=unix
:e
^M
:e ++ff=unix
:w ++ff=unix
我通常使用
:%s/\r/\r/g
这看起来有点奇怪,但由于 Vim 匹配换行的方式而有效。我也发现更容易记住:)
评论
:set ff=unix
fileformat=unix
^M
:%s/\r//g
:%s/\r//g
:set ff=unix
:e ++ff=unix
通常有一个命令可用于此目的。只要确保你阅读了手册,因为GNU和BSD版本在处理参数的方式上有所不同。dos2unix
BSD 版本:
dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME
GNU 版本:
dos2unix $FILENAME
或者,您可以使用此处的任何建议答案创建自己的答案,例如:dos2unix
function dos2unix(){
[ "${!}" ] && [ -f "{$1}" ] || return 1;
{ echo ':set ff=unix';
echo ':wq';
} | vim "${1}";
}
dos2unix
可以直接修改文件内容。
您可以直接在文件上使用它,而无需任何临时文件重定向。
dos2unix input.txt input.txt
以上使用假定的美式键盘。使用选项以使用英国键盘。-437
dos2unix -437 input.txt input.txt
以下步骤可以将DOS的文件格式转换为Unix:
:e ++ff=dos Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix This buffer will use LF-only line endings when written.[A 2]
:w Write buffer using Unix (LF-only) line endings.
参考:文件格式
评论
tr -d '\15\32' < winfile.txt > unixfile.txt
(请参阅:在 Unix 和 Windows 文本文件之间转换)
关于让 ^M 出现的评论对我有用。仅仅在我的 vi 中输入“^M”一无所获(未找到)。不过,+ + 序列完美地做到了这一点。CTRLVCTRLM
我的工作替换命令是
:%s/Ctrl-V Ctrl-M/\r/g
它在我的屏幕上看起来像这样:
:%s/^M/\r/g
将文件目录从DOS到Unix
使用命令行和 sed,查找当前目录中扩展名为“.ext”的所有文件,并删除所有“^M”
@ https://gist.github.com/sparkida/7773170
find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;
此外,如前面的答案所述,^M = +(不要只键入插入符号“^”符号和 M)。Ctrl+VCtrl+M
以下命令用于重新格式化当前目录中的所有 .sh 文件。我在我的 Fedora OS 上测试了它。
for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
来自Wikia:
%s/\r\+$//g
这将找到所有回车标志(一个或多个重复)直到行尾并删除,因此将停留在 EOL。\n
我找到了一个非常简单的方法:用nano打开文件:nano file.txt
按 + 保存,但在按 之前,按:+ 在 DOS 和 Unix/Linux 行尾之间切换,或按:+ 在 Mac 和 Unix/Linux 行尾之间切换,然后按保存和 + 退出。CtrlOEnterAltDAltMEnterCtrlX
评论
^M
cat -v
这是我的方式。我在DOS EOL中打开了一个文件,当我保存文件时,它将自动转换为Unix EOL:
autocmd BufWrite * :set ff=unix
您可以使用:
vim somefile.txt +"%s/\r/\r/g" +wq
或者 dos2unix 实用程序。
我想要换行符代替 ^M。Perl 来救援:
perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt
或者写信给 stdout:
perl -p -e 's/\x0d/\n/g' < excel_created.txt
如果你在 Windows 的记事本或 Notepad++ 中创建一个文件,把它带到 Linux,然后用 Vim 打开它,你会在每行的末尾看到 ^M。要删除它,
在 Linux 终端上,键入
dos2unix filename.ext
这将发挥所需的魔力。
评论
我知道我在某个地方见过这个。以下是 FreeBSD 的登录提示:
您需要从 DOS 文件中删除所有这些 ^M 字符吗?尝试
tr -d \\r < dosfile > newfile
-- Originally by Dru <[email protected]>
在 Vim 中,键入:
:w !dos2unix %
这会将当前缓冲区的内容通过管道传递给 dos2unix 命令,并将结果写入当前内容。Vim 会要求在之后重新加载文件。
要直接在 Linux 控制台中运行,请执行以下操作:
vim file.txt +"set ff=unix" +wq
在 VIM 中:
:e ++ff=dos | set ff=unix | w!
在带有 VIM 的 shell 中:
vim some_file.txt +'e ++ff=dos | set ff=unix | wq!'
e ++ff=dos
- 强制打开文件的格式。dos
set ff=unix
- 将文件转换为格式。unix
评论
这比您要求的要多一点,但是:
nmap <C-d> :call range(line('w0'),line('w$'))->map({_,v-> getline(v)})->map({_,v->trim(v,join(map(range(1,0x1F)+[0xa0],{n->n->nr2char()}),''),2)})->map({k,v->setline(k+1,v)})<CR>
运行它,不再需要 unix2dos。:set ff=unix|dos
- trim() 的单个 arg 形式具有相同的默认掩码,加上 0X20(实际空格)而不是 0x1F
- 该默认掩码会清除所有非打印字符,包括难以找到的不间断空格 [0xa0]
- 从线条范围创建线列表
- 使用与源相同的掩码代码将该列表映射到 trim 函数,减少空格
- 再次将其映射到 setline 以替换线。
- 此时所要做的就是选择使用哪个 EOL 来保存它,DOS 或 Unix
:set fileformat=
- 如果您想消除或添加一些字符,更改上面的字符范围应该很容易
要一次性删除这些行尾字符,无论它们在行中的哪个位置出现(如果两行仅用 a 分隔,则这不是一个好主意,因为命令将行连接在一起):DOS/Windows
CR
:%s/\r//g
参考:文件格式 -> 6.删除不需要的 CR 或 LF 字符。
但是,您可以选择将这些行尾转换为 。DOS/Windows
Unix
这意味着,要从任何行尾的混合转换当前文件,因此所有行都仅以以下结尾:CRLF/LF-only
LF
:update Save any changes.
:e ++ff=dos Edit file again, using dos file format ('fileformats' is ignored).
:setlocal ff=unix This buffer will use LF-only line endings when written.
:w Write buffer using unix (LF-only) line endings.
参考:文件格式 -> 3.转换当前文件。
在上面的上下文中,替换 with 将写入带有 mac () 行尾的文件。或者,如果它一开始就是 mac 文件,则可以使用正确读取文件,以便将行尾转换为 或 。:set ff=unix
:set ff=mac
CR-only
:e ++ff=mac
unix
dos
更多参考资料:
1.配置行分隔符 -> 更改当前文件(IntelliJ IDEA)的行分隔符。
评论
hexdump -C badfile
0x0d 0x0a
"\r\n"
^M
,我该如何摆脱它?