使用sed从文件中删除^ M个字符

时间:2013-10-16 14:40:49

标签: sed awk

我在文件中有这一行:

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

9 个答案:

答案 0 :(得分:54)

使用tr

tr -d '^M' < inputfile

(请注意,可以使用 Ctrl + V Ctrl + M 输入^M字符。


编辑:按suggested Glenn Jackman,如果您使用的是bash,您还可以说:

tr -d $'\r' < inputfile

答案 1 :(得分:14)

仍然是同一行:

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

键入命令时,对于^M键入 Ctrl + V Ctrl + M

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

:%s/^M//g

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

答案 2 :(得分:6)

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

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

希望有所帮助。

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

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

当它没有立即跟随\ n时它不会删除\ r \ n并用\ n替换它们。对于某些类型的文件(例如我刚刚测试过的文件),这会失败。

答案 3 :(得分:5)

alias dos2unix="sed -i -e 's/'\"\$(printf '\015')\"'//g' "

用法:

dos2unix file

答案 4 :(得分:3)

如果Perl是一个选项:

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

-i生成输入文件的.bak版本 \r =回车
\n =换行 $ =行尾 s/foo/bar/g =全局用“bar”代替“foo”

答案 5 :(得分:1)

我同意@twalberg(请参阅上面的accepted answer comments),Mac OSX上的dos2unix涵盖了这一点,引用了man dos2unix

  

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

我决定使用'mac2unix',它删除了我的较少cmd可见的'^ M'条目,由两个Yosemite(OSX 10.10)Mac之间的Apple'Messages'传输bash脚本引入!

我使用流行的Homebrew软件包安装程序在Mac OSX上安装了'dos2unix',我强烈推荐它和它的配套命令Cask

答案 6 :(得分:1)

在awk中:

sub(/\r/,"")

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

答案 7 :(得分:1)

这是更好的实现方式

tr -d '\015' < inputfile_name > outputfile_name

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

答案 8 :(得分:0)

这是干净简单的,并且有效:

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

其中\r当然等同于^M