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


当前回答

在任何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
% 

其他回答

事情是这样的,

%0d是回车字符。使它与Unix兼容。我们需要使用下面的命令。

dos2unix fileName。extension fileName.extension

tr -d '\r' < infile > outfile

看到tr (1)

我制作了这个shell脚本来删除\r字符。它适用于solaris和red-hat:

#!/bin/ksh

LOCALPATH=/Any_PATH

for File in `ls ${LOCALPATH}`
do
   ARCACT=${LOCALPATH}/${File}
   od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
   printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
   rm ${ARCACT}.TMP
done

exit 0

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

fromdos file

你可以简单地这样做:

$ echo $(cat input) > output