我运行 sed 对窗口进行了一些替换,我注意到它自动将行结尾转换为 Unix (n)。是否有一个选项告诉 sed 使用 Windows 行结束符(r n) ,或者更好地保留文件中的行结束符?
注意: 我使用的 sed 来自 unxutils: http://unxutils.sourceforge.net/
您可以尝试在现有脚本的末尾将 \n替换为 \r\n,如下所示:
\n
\r\n
sed 's/foo/bar/;s/$/\r/'
也许吧
sed -e 's/foo/bar/' -e 's/$/\r/'
如果以上两种方法都不起作用,那么您必须查阅 sed版本的特定手册页,以查看是否存在这样的选项。请注意,sed的 * nix 版本可以在没有被告知这样做的情况下更改行终止符。
sed
另一种选择是使用 sed的 cygwin版本,其中 不应该具有这种不良行为。
cygwin
另外,(Cygwin 版本的) perl -pe似乎没有这个问题。
perl -pe
可以使用 sed 的 -b选项将文件视为二进制文件。这将解决 Cygwin 的 sed 在 Windows 上的问题。
-b
例子: sed -b 's/foo/bar/'
sed -b 's/foo/bar/'
如果您希望匹配行尾,请记住匹配、捕获并复制可选的回车。
例子: sed -b 's/foo\(\r\?\)$/bar\1/'
sed -b 's/foo\(\r\?\)$/bar\1/'
来自 Sed 手册页:
- 二...-二进制 此选项在每个平台上都可用,但只有在操作系统区分文本文件和二进制文件时才有效。如果进行这样的区分ーー就像 MS-DOS 的情况一样,Windows、 Cygwin ーー文本文件是由回车符和换行符分隔的行组成的,sed 没有看到结束的 CR。如果指定了此选项,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-windows的 sed-4.4.exe是纯粹的胜利
sed-4.4.exe
-i
-z
\0
参见 系统设计选项列表和 所有窗口 sed 端口的列表。
请注意,Gnuwin32 sed 4.2.1在 -bi模式下执行 腐败的结局,根本没有 -z模式。
-bi