保留行结束
我运行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