【问题标题】:Preserve line endings保留行尾
【发布时间】:2011-06-06 20:42:13
【问题描述】:

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

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

【问题讨论】:

  • 以下解决方案不适用于 macOS。
  • 我什至走到了这一步,但它仍然没有工作LC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
  • 所以实际上上面的命令确实有效,我刚刚在git diff 程序中发现了一个错误。
  • 你可以使用sed(没有任何特殊选项)+ unix2dos

标签: windows sed


【解决方案1】:

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

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

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

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

来自sed man page

-b      --二进制

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

【讨论】:

  • 请注意,这不适用于 cygwin 上的 sed -i(对我而言),但您可以解决这个问题。感谢您的更新——其他答案是一段时间内关于这个主题的最后一句话。
  • 注意,此选项不适用于 Mac 上的 sed。
  • 即使使用sed -i 也对我有用:如何输入它很重要。虽然sed -bised -i -b 有效,但sed -ib 有效:请参阅手册页了解原因(使用b 作为备份副本的后缀)。
  • 使用:sed -bi 's/foo/bar/'
  • 在 Windows cygwin 中对我不起作用。在 sed 进行更改的行上,行结尾是 Unixy。其余行有窗口行结尾。因此,我的文件混合了具有不同行尾的行。
【解决方案2】:

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

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

或许

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

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

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

【讨论】:

  • cygwin 版本确实有这种不良行为。
  • 如果文件同时包含 \n (0x0A) 和 \r\n (0x0D 0x0A) - 这个建议的解决方案(总是重新注入 \r)会破坏它。
  • 这适用于我使用 MSYS2/MinGW。谢谢@SiegeX。
【解决方案3】:

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

【讨论】:

  • sed 在 MacOS 上没有 -b 选项,并且存在与原始问题中所述类似的问题。 perl 替代方案没有这个问题,所以感谢您的建议。 sed -i -e 's/<img[^>]*\/>//g' *.xml 将行尾替换为 '\n' perl -i -p -e 's/<img[^>]*\/>//g' *.xml 保留原始行尾
【解决方案4】:

如果您只指定 -b 开关和重定向,则可以抑制 Gnuwin 以弄乱换行符 (win->unix)。使用 -i(内联)开关会搞砸。

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

【讨论】:

  • my answer 中查看具有工作-i 模式的版本。
【解决方案5】:

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

  • 在默认模式下使用 windows CRLF 行尾
  • -b 模式下保留原始行结尾
  • 在原地-i 模式下正常工作
  • 还提供带有\0 分隔符的-z 模式,而不是\n,而may be handy sometimes 也是

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

请注意,gnuwin32 sed 4.2.1-bi 模式下是 corrupt line endings,而根本没有 -z 模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多