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

Gau*_*dar 17 regex macos sed carriage-return

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

sed -i 's/\r//g' <file>
Run Code Online (Sandbox Code Playgroud)

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

sed -i $'s/\r//' <file>
Run Code Online (Sandbox Code Playgroud)

并且"g"也不是必需的.

为什么会这样?

anu*_*ava 31

这是因为sedOSX上的可用性\r不像sedLinux上那样识别为特殊字符.

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

sed -i.bak $'s/\r//' file
Run Code Online (Sandbox Code Playgroud)

或这个:

sed -i.bak "s/$(printf '\r')//" file
Run Code Online (Sandbox Code Playgroud)

或者你可以tr在OSX上使用:

tr -d '\r' < file
Run Code Online (Sandbox Code Playgroud)


Wil*_*per 8

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

sed -i.bak $'s/\x0D//' file
Run Code Online (Sandbox Code Playgroud)

因为返回字符具有ASCII码0D.\ x替换适用于sed的所有POSIX版本,您可以通过查找ASCII代码来匹配任何其他麻烦的字符.要查找其他有效替换,请执行man re_format或查看ASCII表.

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
Run Code Online (Sandbox Code Playgroud)

将每个\ r \n转换为\n.)