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


当前回答

如果你是一个Vi用户,你可以打开文件并删除回车符:

:%s/\r//g

或与

:1,$ s/^M//

请注意,您应该通过按ctrl-v和ctrl-m键入^M。

其他回答

尝试将DOS文件转换为Unix文件:

fromdos file

我用的是python,这是我的代码;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

在任何UNIX®系统上删除\r:

这个问题中的大多数现有解决方案都是特定于gnu的,在OS X或BSD上不起作用;下面的解决方案可以在更多的UNIX系统上工作,也可以在从tcsh到sh的任何shell中工作,甚至还可以在GNU/Linux上工作。

在OS X、OpenBSD和NetBSD的tcsh上测试,在Debian GNU/Linux的bash上测试。


对话:

在OS X上的tcsh中,下面的sed代码片段可以与printf一起使用,因为sed和echo都不像GNU那样以特殊的方式处理\r:

sed `printf 's/\r$//g'` input > output

tr:

另一个选项是tr:

tr -d '\r' < input > output

sed和tr的区别:

看起来tr从输入文件中保留了一个尾随换行符,而在OS X和NetBSD(但在OpenBSD或GNU/Linux上没有)上的sed在文件的最后插入一个尾随换行符,即使输入在文件的最后缺少任何尾随\r或\n。


测试:

这里有一些测试示例,可以使用printf和hexdump -C来确保它在您的系统上工作;另外,如果你的系统缺少hexdump,也可以使用od -c:

% printf 'a\r\nb\r\nc' | hexdump -C
00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63                                    |a.b.c|
00000005
% 
tr -d '\r' < infile > outfile

看到tr (1)

我将假设您是指行尾的回车符(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

如果在您的系统上安装了Dos2unix,那么它是正确的选择:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

如果由于某种原因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

如果由于某些原因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

如果你没有在你的盒子上安装任何这些工具,你有比试图转换文件更大的问题:-)