保留行结尾

时间:2011-01-10 23:19:22

标签: windows sed

我运行sed在Windows上进行一些替换,我注意到它会自动将行结尾转换为Unix(\ n)。是否可以选择告诉sed使用Windows行结尾(\ r \ n),甚至更好地保留文件中的行结尾?

注意:我使用来自unxutils的sed:http://unxutils.sourceforge.net/

5 个答案:

答案 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)

如果你只指定了-b开关和重定向,那么可以抑制Gnuwin搞乱新行(win-> unix)。使用-i(内联)开关会搞砸它。

E.g。 sed.exe -b" s / \ xFF \ xFE //" c:\ temp \ in.csv> C:\ TEMP \ out.csv

答案 4 :(得分:0)

我发现来自https://github.com/mbuilov/sed-windowssed-4.4.exe纯粹是胜利

  • 在默认模式下使用Windows CRLF行结尾
  • -b模式
  • 保留原始行结尾
  • 可与就地-i模式
  • 一起正常使用
  • 还提供-z模式,\0分隔符代替\n may be handy sometimes

另请参阅list of sed optionslist of all windows sed ports

请注意,gnuwin32 sed 4.2.1-bi模式下执行corrupt line endings并且根本没有-z模式。