我运行sed在Windows上进行一些替换,我注意到它会自动将行结尾转换为Unix(\ n)。是否可以选择告诉sed使用Windows行结尾(\ r \ n),甚至更好地保留文件中的行结尾?
注意:我使用来自unxutils的sed:http://unxutils.sourceforge.net/
答案 0 :(得分:130)
您可以使用sed的-b
选项让它将文件视为二进制文件。这将解决cygwin在Windows上的问题。
示例:sed -b 's/foo/bar/'
如果您希望匹配行尾,请记住匹配,捕获并复制可选回车。
示例:sed -b 's/foo\(\r\?\)$/bar\1/'
来自sed man page:
-b --binary
此选项在每个平台上都可用,但仅在操作系统区分文本文件和二进制文件时才有效。当进行这样的区分时 - 就像MS-DOS,Windows的情况一样,Cygwin文本文件由回车符和换行符分隔的行组成,而sed看不到结束CR。如果指定了此选项,sed将以二进制模式打开输入文件,因此不会请求此特殊处理并考虑以换行符结束行。
答案 1 :(得分:10)
您可以尝试在现有脚本的末尾为\n
提供\r\n
,如下所示:
sed 's/foo/bar/;s/$/\r/'
或者
sed -e 's/foo/bar/' -e 's/$/\r/'
如果以上两者都不起作用,您将需要查阅您的sed
版本的特定手册页,看看是否存在这样的选项。请注意,* {nix}版本的sed
不会 更改行终止符而不会被告知这样做。
另一种方法是使用cygwin
sed
版本的{{1}} 不应该有这种不良行为。
答案 2 :(得分:6)
或者,({cygwin版本的)perl -pe
似乎没有这个问题。
答案 3 :(得分:1)
E.g。 sed.exe -b" s / \ xFF \ xFE //" c:\ temp \ in.csv> C:\ TEMP \ out.csv
答案 4 :(得分:0)
我发现来自https://github.com/mbuilov/sed-windows的sed-4.4.exe
纯粹是胜利
-b
模式-i
模式-z
模式,\0
分隔符代替\n
may be handy sometimes 另请参阅list of sed options和list of all windows sed ports。
请注意,gnuwin32 sed 4.2.1在-bi
模式下执行corrupt line endings并且根本没有-z
模式。