在Linux上用于删除回车符我们可以执行:
sed -i 's/\r//g' <file>
但是这同样适用于Mac OS X.需要像$
一样:
sed -i $'s/\r//' <file>
并且“g”也不是必需的。
为什么会这样?
这是因为在OSX上可用的sed
不会将\r
识别为特殊字符,这与Linux上的sed
不同。
您可以按照您使用的方式使用它:
sed -i.bak $'s/\r//' file
或这个:
sed -i.bak "s/$(printf '\r')//" file
或者你可以在OSX上使用tr
:
tr -d '\r' < file
另一种便携灵活的解决方案是:
sed -i.bak $'s/\x0D//' file
因为返回字符具有ASCII码0D。 \ x替换适用于sed的所有POSIX版本,您可以通过查找ASCII代码来匹配任何其他麻烦的字符。要查找其他有效替换,请执行man re_format
或查看ASCII Table。
Linux需要final / g,因为回车符(\ r)不会结束行。许多Windows“纯文本”编辑器(例如记事本)以回车符和新行(\ r \ n)结束每一行,但是OS 9(ca. 2001)或更早版本的Mac结束了“纯文本”文件的每一行单\ r。如果要清理Windows文件,则任何* X系统都不需要/ g。如果您使用的是macOS,则也不需要/ g,因为macOS将单个\ r \ n识别为行尾。
(读取旧Mac文件的Linux系统会认为所有文本都在一条非常长的行上并且只转换第一个\ r。如果你在Linux系统上并且需要保留旧Mac文件中的换行符,
sed -i.bak $'s/\x0D/\x0A/g' file
将每个\ r \ n转换为\ n。)