保留线的末端

我运行 sed 对窗口进行了一些替换,我注意到它自动将行结尾转换为 Unix (n)。是否有一个选项告诉 sed 使用 Windows 行结束符(r n) ,或者更好地保留文件中的行结束符?

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

26805 次浏览

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

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

也许吧

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

如果以上两种方法都不起作用,那么您必须查阅 sed版本的特定手册页,以查看是否存在这样的选项。请注意,sed的 * nix 版本可以在没有被告知这样做的情况下更改行终止符。

另一种选择是使用 sedcygwin版本,其中 不应该具有这种不良行为。

另外,(Cygwin 版本的) perl -pe似乎没有这个问题。

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

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

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

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

来自 Sed 手册页:

- 二...-二进制

此选项在每个平台上都可用,但只有在操作系统区分文本文件和二进制文件时才有效。如果进行这样的区分ーー就像 MS-DOS 的情况一样,Windows、 Cygwin ーー文本文件是由回车符和换行符分隔的行组成的,sed 没有看到结束的 CR。如果指定了此选项,sed 将以二进制模式打开输入文件,因此不会请求此特殊处理,并考虑以换行结束行。`

如果您只指定-b 开关和重定向,Gnuwin 可能会被抑制,从而搞乱换行符(win-> unix)。使用-i (inline)开关会把它搞乱。

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

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

  • 在默认模式下使用 Windows CRLF 行结尾
  • -b模式下保留原始行结尾
  • 正常工作与就地 -i模式
  • 也提供 -z模式与 \0分界线而不是 \n有时候可能会很方便

参见 系统设计选项列表所有窗口 sed 端口的列表

请注意,Gnuwin32 sed 4.2.1-bi模式下执行 腐败的结局,根本没有 -z模式。