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


当前回答

对于UNIX……我注意到dos2unix从我的UTF-8文件中删除了Unicode头。在git bash (Windows)下,下面的脚本似乎工作得很好。它使用sed。注意,它只删除行尾的回车符,并保留Unicode标头。

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

其他回答

如果你使用的操作系统(如OS X)没有dos2unix命令,但有Python解释器(2.5+版本),这个命令相当于dos2unix命令:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

它处理命令行上的命名文件以及管道和重定向,就像dos2unix一样。如果您将这一行添加到~/。Bashrc文件(或其他shell的等效配置文件):

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

... 下次登录时(或运行source ~/.)您将能够在命令行上以与其他示例相同的方式使用dos2unix名称。

Sed -i s/\r// <文件名>或someesuch;请参阅man sed或web上有关sed使用的丰富信息。

有一点需要指出的是上面“马车返回”的确切含义;如果您真正指的是单个控制字符“回车”,那么上面的模式是正确的。如果您指的是更一般的CRLF(回车和换行,这是Windows下换行的实现方式),那么您可能希望替换\r\n。Linux/Unix中的换行符(换行符)是\n。

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

这又是一个解决方案……因为总还有一个问题:

perl -i -pe 's/\r//' filename

它很好,因为它可以在我使用过的所有unix/linux版本中工作。

我制作了这个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