使用sed删除Mac OS X上的回车符

问题描述 投票:17回答:2

在Linux上用于删除回车符我们可以执行:

sed -i 's/\r//g' <file>

但是这同样适用于Mac OS X.需要像$一样:

sed -i $'s/\r//' <file>

并且“g”也不是必需的。

为什么会这样?

regex macos sed carriage-return
2个回答
29
投票

这是因为在OSX上可用的sed不会将\r识别为特殊字符,这与Linux上的sed不同。

您可以按照您使用的方式使用它:

sed -i.bak $'s/\r//' file

或这个:

sed -i.bak "s/$(printf '\r')//" file

或者你可以在OSX上使用tr

tr -d '\r' < file

8
投票

另一种便携灵活的解决方案是:

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。)

© www.soinside.com 2019 - 2024. All rights reserved.