保留行结束

我运行sed在Windows上进行一些replace,我注意到它会自动将行结束符转换为Unix(\ n)。 是否有一个选项告诉sed使用Windows行尾(\ r \ n),或者甚至更好地保留文件的行尾?

注意:我使用sed从unxutils: http ://unxutils.sourceforge.net/

您可以使用-b选项来让sed将文件视为二进制文件。 这将解决与cygwin的sed在Windows上的问题。

例如: sed -b 's/foo/bar/'

如果您希望匹配行尾,请记住匹配,捕获并复制可选的回车。

例如: sed -b 's/foo\(\r\?\)$/bar\1/'

从sed手册页 :

-b – 二进制

此选项在每个平台上都可用,但仅在操作系统区分文本文件和二进制文件的情况下才有效。 当与MS-DOS,Windows的情况一样时,Cygwin文本文件由回车符和换行符分隔的行组成,sed不会看到结尾的CR。 当这个选项被指定时,sed将以二进制模式打开input文件,因此不要求这个特殊的处理,并且考虑以换行结束的行。

您可以尝试在您的现有脚本的末尾将\n\r\n ,如下所示:

 sed 's/foo/bar/;s/$/\r/' 

也许

  sed -e 's/foo/bar/' -e 's/$/\r/' 

如果上述两者都不工作,则必须查阅您的sed版本的特定手册页,以查看是否存在此类选项。 请注意,* nix版本的sed 不会在不被告知的情况下改变行结束符。

另一种select是使用cygwin版本的sed不应该有这种不良行为。

或者,(cygwin版本的) perl -pe似乎没有这个问题。

如果只指定-b开关并redirect,则可以禁止Gnuwin来弄乱换行(win-> unix)。 使用-i(内联)开关会搞砸了。

例如sed.exe -b“s / \ xFF \ xFE //”c:\ temp \ in.csv> c:\ temp \ out.csv