在Unix中删除回车

Ald*_*dur 207 unix carriage-return

\r在Unix中从文件中删除所有回车的最简单方法是什么?

pax*_*blo 246

我会假设你的意思回车(CR,"\r",0x0d在)两端线,而不是在文件中只是一味的(你可以有他们在字符串的中间为我所知道的).CR仅在第一行末尾使用此测试文件:

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017
Run Code Online (Sandbox Code Playgroud)

dos2unix 如果它安装在你的系统上,那就是要走的路:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因dos2unix无法使用,那么sed将会这样做:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因sed无法使用,那么ed将以复杂的方式进行:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016
Run Code Online (Sandbox Code Playgroud)

如果您的盒子上没有安装任何这些工具,那么您遇到的问题比尝试转换文件要大:-)

  • 详细说明@ steve的评论:在Mac上,使用以下命令:`sed"s/$(printf'\ r')\ $ //"` (29认同)
  • `sed`和`echo`都不能识别MacO上的`\ r``.在这种情况下,只有`printf"\ r"`似乎有效. (15认同)
  • `\ r`只适用于GNU sed,否则你可以这样做:`sed \`echo"s /\r //"\`` (13认同)
  • 要修复mac上的问题,你也可以在单引号sed字符串前加上`$`,如下所示:`sed $'s @\r @@ g'| od -c`(但如果你用`\n替换'你需要逃脱它) (7认同)
  • 我不是 100% 确定,但对于 OS X,使用 `CTRL-V + CTRL-M` 代替 `\r` 看起来可能可行。 (2认同)

Hen*_*son 219

tr -d '\r' < infile > outfile
Run Code Online (Sandbox Code Playgroud)

tr(1)

  • 1.大多数unixy工具都是这样工作的,而且它通常是最安全的解决方法,因为如果搞砸了你还有原版.2.所述问题是取消回车,而不是转换行结尾.但是还有很多其他答案可能会对你有所帮助. (8认同)
  • 不是很好:1.不能在原地工作,2.可以替换\ r也不能在EOL(可能是也可能不是你想要的......). (4认同)
  • @donlan,回复晚了,但你通常使用类似:`someProg &lt;in &gt;out &amp;&amp; mv out in`。 (3认同)
  • 如果你的 `tr` 不支持 `\r` 转义,请尝试 `'\015'` 或者文字 `'^M'` (在许多终端上的许多 shell 中,ctrl-V ctrl-M 将生成一个文字ctrl-M 字符)。 (2认同)

pli*_*nth 37

老套:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns
Run Code Online (Sandbox Code Playgroud)


Emi*_*l H 27

有一个名为dos2unix的实用程序存在于许多系统上,并且可以在大多数系统上轻松安装.

  • 有时它也被称为fromdos(和todos). (6认同)

wfj*_*fjm 26

在我看来,Linux上最简单的方法是:

sed -i 's/\r$//g' <filename>
Run Code Online (Sandbox Code Playgroud)

强引号周围的替换操作's/\r//'必不可少的.如果没有它们,shell将解释\r为escape + r并将其缩小为plain r,并删除所有小写r.这就是为什么Rob在2009年给出的答案不起作用的原因.

并且添加/g修饰符可确保即使是多个\r也将被删除,而不仅仅是第一个.

  • 不要只使用 -i 而要使用 -i.bak 它将创建带有 .bak 扩展名的原始文件的备份 (2认同)

Rob*_*Rob 7

sed -i s/\r// <filename>或某些; 看到man sed或网上有关使用的丰富信息sed.

有一点需要指出的是上述"回车"的确切含义; 如果你真的是指单个控制字符"回车",那么上面的模式是正确的.如果你的意思更一般地说是CRLF(回车和换行,这是在Windows下实现换行的方式),那么你可能想要替换它\r\n.Linux/Unix中的裸线馈送(换行符)是\n.

  • 仅供参考,`s /\r //`似乎不会删除OS X上的回车,它似乎会删除文字`r`字符.我不知道为什么会这样.也许它与引用字符串的方式有关?作为一种解决方法,使用`CTRL-V + CTRL-M`代替`\ r``似乎可行. (4认同)

Ale*_*tis 6

如果您是Vi用户,则可以打开该文件并删除回车符:

:%s/\r//g
Run Code Online (Sandbox Code Playgroud)

或者

:1,$ s/^M//
Run Code Online (Sandbox Code Playgroud)

请注意,您应该按ctrl-v然后按ctrl-m键入^ M.

  • 不太好:如果文件在每一行都有CR(即是一个正确的DOS文件),vim会用filetype = dos加载它,而不是显示`^ M`-s.解决这个问题是大量的击键,这不是vim的用途;).我只是选择`sed -i`,然后`-e's /\r $ $ g'来限制在EOL中删除CR. (2认同)

Jam*_*vec 6

别人推荐的dos2unix,我也强烈推荐。我只是提供更多细节。

如果已安装,请跳至下一步。如果尚未安装,我建议通过yum以下方式安装:

yum install dos2unix
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
Run Code Online (Sandbox Code Playgroud)


小智 6

再一次解决方案...因为总有一个解决方案:

perl -i -pe 's/\r//' filename
Run Code Online (Sandbox Code Playgroud)

这很好,因为它已经到位并适用于我曾经使用过的unix/linux的各种风格.