如果我打开在 Windows 中创建的文件,这些行都以^M
. 如何一次删除这些字符?
27 回答
dos2unix是一个命令行实用程序,可以执行此操作,或者:%s/^M//g
如果您使用Ctrl- v Ctrl-m输入 ^M,或者您可以:set ff=unix
,Vim 会为您执行此操作。
有关于文件格式设置的文档, Vim wiki 有一个关于行尾转换的综合页面。
或者,如果你频繁地来回移动文件,你可能不想转换它们,而是想转换它们,:set ff=dos
所以 Vim 会知道它是一个 DOS 文件并使用 DOS 约定作为行尾。
更改视图中的行尾:
: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
我通常使用
:%s/\r/\r/g
这似乎有点奇怪,但由于 Vim 匹配换行符的方式而有效。我也发现它更容易记住:)
我更喜欢使用以下命令:
:set fileformat=unix
您还可以使用mac
或dos
将您的文件分别转换为 Mac 或 MS-DOS/Windows 文件约定。如果文件已经是正确的格式,它什么也不做。
有关详细信息,请参阅 Vim 帮助:
:help fileformat
:set fileformat=unix
从 DOS 转换为 Unix。
:%s/\r\+//g
在 Vim 中,这会去掉所有回车,只留下换行符。
来自:文件格式
[Esc] :%s/\r$//
dos2unix
可以直接修改文件内容。
您可以直接在文件上使用它,而无需临时文件重定向。
dos2unix input.txt input.txt
以上使用假定的美式键盘。使用该-437
选项使用英国键盘。
dos2unix -437 input.txt input.txt
将文件目录从 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 = Ctrl+V+ Ctrl+M(不要只键入插入符号“^”符号和 M)。
在 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
格式。
以下步骤可以将 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
直接在 Linux 控制台中运行:
vim file.txt +"set ff=unix" +wq
使用以下命令:
:%s/^M$//g
要让^M
出现,请键入CtrlV,然后CtrlM。 CtrlV告诉 Vim 按字面意思输入下一个字符。
关于让 ^M 出现的评论对我有用。仅在我的 vi 中键入“^M”一无所获(未找到)。CTRL++序列虽然完美地完成了它V CTRL。M
我的工作替换命令是
:%s/Ctrl-V Ctrl-M/\r/g
它在我的屏幕上看起来像这样:
:%s/^M/\r/g
:g/Ctrl-v Ctrl-m/s///
CtrlM是 DOS 行尾添加的字符\r
或回车符。CtrlV告诉 VimCtrlM在命令行插入一个文字字符。
作为一个整体,此命令将所有内容都替换\r
为空,将它们从行尾删除。
我找到了一个非常简单的方法:使用nano打开文件:nano file.txt
按Ctrl+O保存,但在按 之前Enter,按:Alt+D在 DOS 和 Unix/Linux 行尾之间切换,或:Alt+M在 Mac 和 Unix/Linux 行尾之间切换,然后按Enter保存,Ctrl+X退出。
您可以使用以下命令:
:%s/^V^M//g
'^' 表示使用CTRL密钥。
以下命令用于重新格式化当前目录中的所有 .sh 文件。我在我的Fedora操作系统上对其进行了测试。
for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
通常有一个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\+$//g
这将找到所有回车符号(一个和多个代表)直到行尾并删除,所以只会\n
留在 EOL。
这是我的方式。我在 DOS EOL 中打开了一个文件,当我保存文件时,它会自动转换为 Unix EOL:
autocmd BufWrite * :set ff=unix
我想要换行符代替 ^M。Perl 的救援:
perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt
或写入标准输出:
perl -p -e 's/\x0d/\n/g' < excel_created.txt
如果你在 Windows 的 Notepad 或Notepad++中创建一个文件,把它带到 Linux 上,然后用 Vim 打开它,你会在每一行的末尾看到 ^M。要删除它,
在您的 Linux 终端上,键入
dos2unix filename.ext
这将发挥所需的魔力。
我知道我在某个地方看到过这个。这是FreeBSD登录提示:
您是否需要从 DOS 文件中删除所有这些 ^M 字符?尝试
tr -d \\r < dosfile > newfile
-- Originally by Dru <genesis@istar.ca>