【发布时间】:2010-09-10 02:38:30
【问题描述】:
如果我打开在 Windows 中创建的文件,所有行都以 ^M 结尾。
如何一次性删除这些字符?
【问题讨论】:
-
如果您执行
hexdump -C badfile并看到0x0d 0x0a"\r\n"那是您的问题。
标签: linux vim file editor dos2unix
如果我打开在 Windows 中创建的文件,所有行都以 ^M 结尾。
如何一次性删除这些字符?
【问题讨论】:
hexdump -C badfile 并看到0x0d 0x0a "\r\n" 那是您的问题。
标签: linux vim file editor dos2unix
在 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 格式。
【讨论】:
dos2unix 是一个命令行实用程序,如果您使用 Ctrl-v Ctrl-:%s/^M//g 将执行此操作kbd>m 输入 ^M,或者你可以:set ff=unix,Vim 会帮你做。
有关于fileformat 设置的文档,Vim wiki 有一个全面的page on line ending conversions。
或者,如果你经常来回移动文件,你可能不想转换它们,而是做:set ff=dos,这样 Vim 就会知道它是一个 DOS 文件,并使用 DOS 约定作为行尾。
【讨论】:
:%s/^M//g 应该是:%s/\r//g,因为^M 只是表示“匹配行首的大写“M”。
:%s/\r//g 为我工作,干杯@Bunyk
set ff=unix 什么都不做。也许它会转换文件,但所有 ^M 字符仍然存在。
直接在 Linux 控制台中运行:
vim file.txt +"set ff=unix" +wq
【讨论】:
【讨论】:
我知道我在某个地方看到过这个。这是FreeBSD 登录提示:
您需要从 DOS 文件中删除所有这些 ^M 字符吗?试试
tr -d \\r < dosfile > newfile
-- Originally by Dru <genesis@istar.ca>
【讨论】:
如果您在记事本中创建文件或在 Windows 中创建Notepad++ 文件,将其带到 Linux 并通过 Vim 打开它,您将在每一行的末尾看到 ^M。要删除它,
在您的 Linux 终端上,键入
dos2unix filename.ext
这将发挥所需的魔力。
【讨论】:
【讨论】:
这是我的方式。我在 DOS EOL 中打开了一个文件,当我保存文件时,它会自动转换为 Unix EOL:
autocmd BufWrite * :set ff=unix
【讨论】:
我找到了一个很简单的方法:用nano打开文件:nano file.txt
按 Ctrl + O 保存,但在按 Enter 之前,按:Alt+ D 在 DOS 和 Unix/Linux 行尾之间切换,或者:Alt+M 在 Mac 和 Unix/Linux 行尾之间切换,然后按Enter保存,按Ctrl+X退出。
【讨论】:
^M 结尾。另存为dos保留,另存为linux删除。可以使用cat -v进行检查
来自维基:
%s/\r\+$//g
这将找到直到行尾的所有回车符号(一个和多个代表)并删除,因此只有 \n 将留在 EOL。
【讨论】:
以下命令用于重新格式化当前目录中的所有 .sh 文件。我在我的Fedora 操作系统上对其进行了测试。
for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
【讨论】:
@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 = Ctrl+V + Ctrl+M(不要只键入插入符号“^”符号和 M)。
【讨论】:
tr -d '\15\32' < winfile.txt > unixfile.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.
参考:File format
【讨论】:
dos2unix可以直接修改文件内容。
可以直接在文件上使用,不需要临时文件重定向。
dos2unix input.txt input.txt
以上使用假定的美式键盘。使用-437 选项来使用英国键盘。
dos2unix -437 input.txt input.txt
【讨论】:
通常有一个dos2unix 命令可以用于此目的。请务必阅读手册,因为 GNU 和 BSD 版本在处理参数的方式上有所不同。
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}";
}
【讨论】:
我通常使用
:%s/\r/\r/g
这看起来有点奇怪,但由于 Vim 匹配换行符的方式而有效。我也发现它更容易记住:)
【讨论】:
:set ff=unix没有任何问题,但是我今天打开的文件一定特别奇怪。 Vim 说它已经是fileformat=unix,但所有的行尾都是^M。这个解决方案对我有用。
:%s/\r//g 对我有用。
:%s/\r//g 是唯一 通用解决方案——尤其适用于包含 DOS 和 UNIX 样式换行符的异构混合的混合模式文件。规范的解决方案(例如,:set ff=unix、:e ++ff=unix)假设当前缓冲区的每一行都以相同的换行符样式结束。有时他们会这样做;有时他们不会。 提示悲伤的表情。
:set fileformat=unix 从 DOS 转换为 Unix。
【讨论】:
我更喜欢使用以下命令:
:set fileformat=unix
您还可以使用mac 或dos 分别将您的文件转换为Mac 或MS-DOS/Windows 文件约定。如果文件已经是正确的格式,它什么也不做。
有关更多信息,请参阅 Vim 帮助:
:help fileformat
【讨论】:
^M 字符。
set fileformat=unix 添加到我的 .vimrc 文件有效。
发件人:File format
[Esc] :%s/\r$//
【讨论】:
使用以下命令:
:%s/^M$//g
要显示^M,请键入CtrlV,然后键入CtrlM。 CtrlV 告诉 Vim 直接输入下一个字符。
【讨论】:
:g/Ctrl-v Ctrl-m/s///
CtrlM 是字符\r,或回车,DOS 行尾添加。 CtrlV 告诉 Vim 在命令行插入文字 CtrlM 字符。
作为一个整体,此命令将所有 \r 替换为空,将它们从行尾删除。
【讨论】:
:%s/\r\+//g
在 Vim 中,去掉所有回车,只留下换行符。
【讨论】:
:%s/\r//g 时,它就像一个魅力。
更改视图中的行尾:
: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 比这里写的大多数其他东西好得多,bash 脚本是一个不错的奖励。
:e 命令在我的 Windows vim 安装中似乎没有任何作用。我的视图仍然显示^M 代码。
:e ++ff=unix,但对我来说最简单的工作是:w ++ff=unix 然后退出并重新打开文件。
关于让 ^M 出现的评论对我有用。仅在我的 vi 中键入“^M”一无所获(未找到)。 CTRL+V CTRL+M 序列完美地做到了。
我的工作替换命令是
:%s/Ctrl-V Ctrl-M/\r/g
它在我的屏幕上看起来像这样:
:%s/^M/\r/g
【讨论】:
您可以使用以下命令::%s/^V^M//g
'^' 表示使用 CTRL 键。
【讨论】:
我想用换行符代替 ^M。 Perl 的救援:
perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt
或写入标准输出:
perl -p -e 's/\x0d/\n/g' < excel_created.txt
【讨论】: