保留行结尾

Bog*_*mac 106 windows sed

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

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

小智 133

您可以使用-bsed选项将文件视为二进制文件.这将解决cygwin在Windows上的问题.

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

如果您希望匹配行尾,请记住匹配,捕获和复制可选回车符.

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

sed手册页:

-b - 二进制

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

  • 即使使用`sed -i`也适用于我:如何键入它是很重要的.当`sed -bi`和`sed -i -b`工作时,`sed -ib`不能**工作:请参阅手册页了解原因(使用`b`作为备份副本的后缀). (19认同)
  • 请注意,这不适用于cygwin上的`sed -i`(对我而言),但你可以解决这个问题.感谢您的更新 - 其他答案是关于此主题的最后一句话. (5认同)
  • 缺少-i的最佳解决方法是什么? (3认同)
  • 使用:`sed -bi 's/foo/bar/'` (2认同)
  • 在Windows cygwin中对我不起作用。在sed进行更改的行上,行结尾为Unixy。其余的行具有Windowish的行尾。因此,我的文件混合了行尾不同的行。 (2认同)

Sie*_*geX 10

您可以尝试在现有脚本的末尾分配\nfor \r\n,如下所示:

sed 's/foo/bar/;s/$/\r/'
Run Code Online (Sandbox Code Playgroud)

也许

 sed -e 's/foo/bar/' -e 's/$/\r/'
Run Code Online (Sandbox Code Playgroud)

如果以上两者都不起作用,则必须查阅您的版本的特定手册页sed以查看是否存在此类选项.需要注意的是的*nix的版本sed没有改变行终止,而不被告知这样做.

另一种方法是使用cygwin的版本,sed不应该有这种不良行为.

  • cygwin版本确实存在这种不良行为. (15认同)
  • 如果文件包含\n('0x0A`)和\ r \n(`0x0D 0x0A`) - 这个提议的解决方案(总是重新注入\ r)打破它. (2认同)

see*_*ker 6

或者,(cygwin版本)perl -pe似乎没有这个问题.