31

我在文件中有这一行:

ULNET-PA,client_sgcib,broker_keplersecurities
,KEPLER

我试图摆脱那个 ^M (回车)字符,所以我使用了:

sed 's/^M//g'

但是,这确实会删除 ^M 之后的所有内容:

[root@localhost tmp]# vi test
ULNET-PA,client_sgcib,broker_keplersecurities^M,KEPLER

[root@localhost tmp]# sed 's/^M//g' test
ULNET-PA,client_sgcib,broker_keplersecurities

我想要得到的是:

[root@localhost tmp]# vi test
ULNET-PA,client_sgcib,broker_keplersecurities,KEPLER
4

9 回答 9

62

使用tr

tr -d '^M' < inputfile

(注意^M字符可以用 输入Ctrl+VCtrl+M


编辑:正如Glenn Jackman所建议的,如果你正在使用,你也可以说:bash

tr -d $'\r' < inputfile
于 2013-10-16T14:44:28.113 回答
21

仍然是同一行:

sed -i 's/^M//g' file

当您键入命令时,为^M您键入Ctrl+VCtrl+M

实际上,如果您已经在 vim 中打开了文件,您可以在 vim 中执行以下操作:

:%s/^M//g

同样, ^M你输入Ctrl-V Ctrl-M

于 2013-10-16T14:47:14.093 回答
11

您可以简单地使用大多数 Unix/Linux 系统中可用的 dos2unix。但是我发现以下 sed 命令更好,因为它删除了 dos2unix 不能的 ^M:

sed 's/\r//g' < input.txt >  output.txt

希望有帮助。

注意: ^M 实际上是回车符,在代码中表示为 \r dos2unix 所做的很可能等同于:

sed 's/\r\n/\n/g' < input.txt >  output.txt

当 \r 后面没有紧跟 \n 时,它不会删除 \r,而是将两者都替换为 \n。对于某些类型的文件,例如我刚刚测试过的文件,这会失败。

于 2015-07-20T13:54:42.043 回答
7
alias dos2unix="sed -i -e 's/'\"\$(printf '\015')\"'//g' "

用法:

dos2unix file
于 2015-03-28T08:24:04.180 回答
3

如果 Perl 是一个选项:

perl -i -pe 's/\r\n$/\n/g' file

-i制作输入文件的 .bak 版本
\r= 回车
\n= 换
$
s/foo/bar/g= 行尾 = 将“foo”全局替换为“bar”

于 2015-11-02T23:41:22.537 回答
1

我同意@twalberg(见上面接受的答案评论),Mac OSX 上的 dos2unix 涵​​盖了这一点,引用man dos2unix

要在 Mac 模式下运行,请使用命令行选项“-c mac”或使用命令“mac2unix”或“unix2mac”

我选择了 'mac2unix',它摆脱了我在 2 个 Yosemite (OSX 10.10) Mac 之间的 bash 脚本的 Apple 'Messages' 传输引入的不太可见的 '^M' 条目!

我使用流行的Home brew软件包安装程序在 Mac OSX 上轻松安装了“dos2unix”,我强烈推荐它,它是配套命令Cask

于 2015-07-20T13:37:28.047 回答
1

在 awk 中:

sub(/\r/,"")

如果它在记录的末尾,sub(/\r/,"",$NF)应该就足够了。无需扫描整个记录。

于 2016-11-01T10:43:01.987 回答
1

这是实现的更好方法

tr -d '\015' < inputfile_name > outputfile_name

稍后将文件重命名为原始文件名。

于 2020-07-12T06:53:59.030 回答
0

这是干净和简单的,它的工作原理:

sed -i 's/\r//g' file

其中\r当然是等价于^M.

于 2019-11-22T11:00:37.543 回答