gpt4 book ai didi

linux - 查看某些文件时,为什么 `^M`出现在终端输出中?

转载 作者:行者123 更新时间:2023-12-03 09:56:05 25 4
gpt4 key购买 nike

我正在尝试使用curl将文件发送到端点并将文件保存到计算机。

从Linux发送curl并将其保存在计算机上效果很好,
但是从Windows进行相同的 curl 会在行的每一行末尾添加^M字符。

我在保存之前正在打印文件,看不到^M。保存后仅在远程计算机上查看文件,才会显示^M

简单的字符串替换似乎不起作用。

为什么要添加^M?我该如何预防?

最佳答案

快速解答:这是carriage return。它们是Windows如何编码文本文件的无害但有轻微刺激性的 Artifact 。您可以使用 dos2unix 将它们从文件中删除。您可以将大多数文本编辑器配置为使用“Unix行尾”或“LF行尾”,以防止它们出现在将来从Windows PC创建的新文件中。

长答案(带有一些历史琐事):

在纯文本文件中,当您创建新行(通过按Enter/Enter键)时,该文件中会嵌入一个“换行符”。在Unix/Linux上,这是单个字符'\n',即“换行符”。在Windows上,这是两个连续字符,“\r\n”,“回车符”,后跟“换行符”。

当仍像打字机一样使用物理teletype terminals时,“换行”字符的意思是“将纸张移至下一行”,而“回车”字符的意思是“将滑架一直滑到最下面。打字头在最左边”。从一开始,几乎所有电传终端都支持隐式回车。也就是说,触发换行会自动触发回车。后来开发到Windows的开发人员决定,最好包括显式回车符,以防万一(由于某种原因)电传打字机不能隐式执行。另一方面,Unix开发人员选择在隐式回车的假设下工作。

回车和换行符为ASCII Control Characters,这意味着它们没有可见的表示为独立的可打印字符,而是影响输出光标本身(在这种情况下,是输出光标的位置)。

您看到的“^ M”是回车符的替代表示,不完全“烹调”其输出(即,不应用某些ASCII控制字符的效果)的程序将使用它。 (其他控制字符具有其他以“^”开头的表示形式,并且“^”字符还用于表示nano之类的某些Unix程序中的“ctrl”键盘键。)

您可以使用 dos2unix 将行尾从Windows样式转换为Unix样式。

$ curl https://example.com/file_with_crlf.txt | dos2unix > file.txt

在某些发行版中,默认情况下会包含此工具,而在其他发行版中,可以通过软件包管理器进行安装(例如,在Ubuntu上, sudo apt install dos2unix)。还有一个用于反向的包 unix2dos

大多数用于编码的“智能”文本编辑器(Sublime,Atom,VS Code,Notepad++等)都可以使用Windows样式或Unix样式的行尾愉快地进行读写(这可能需要更改某些配置选项)。通常,通过扫描文件内容来自动检测行尾,并且通常使用操作系统的 native 行尾创建新文件(默认情况下)。甚至新版本的 Notepad都支持Unix样式的行尾。另一方面,如果使用Windows风格的换行符,某些Unix工具将产生奇怪的结果。如果您的代码库将在Unix和Windows操作系统上被人们使用,那么不错的做法是在所有地方都使用Unix样式的行尾。

Windows上的Git还具有可选模式,该模式可以 check out 所有具有Windows样式的换行符的文件,但可以通过Unix样式的换行符将它们检入。

旁注(有趣,但与您的问题没有直接关系):

回车的实际作用(在现代的虚拟终端上,无论是Windows还是Unix)是将输出光标移动到行的开头。如果使用不带换行符的回车符,则可以“覆盖”已打印字符串的一部分。
$ printf "dogdog" ; printf "\rcat\n"
catdog

一些Unix程序使用它来异步更新最后一行输出,以实现诸如实时更新进度指示器之类的功能。例如, curl,如果文件内容以管道传输到其他位置,它将显示stdout上的下载进度。

另外:如果您有一个工具可以尽可能地从字面上解释Windows样式的行尾,并且向它提供了带有Unix样式的行尾的字符串,例如“hello\nworld”,那么您将获得如下输出:
hello
world

幸运的是,这种实现极为罕见,通常,大多数Windows工具都可以将Unix样式的行尾呈现与Windows样式的行尾相同,而不会出现任何问题。

关于linux - 查看某些文件时,为什么 `^M`出现在终端输出中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61458892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com