【问题标题】:Stop sed on windows from changing \r to \r\n停止 sed 在 Windows 上将 \r 更改为 \r\n
【发布时间】:2011-08-08 14:07:22
【问题描述】:

我在 Windows 上使用 sed 以 unix 样式格式删除一些多余的行(\n 行结尾)。不幸的是,sed 替换了这些行尾,即使在它没有更改为 \r\n 的行中也是如此。我怎样才能阻止 sed 这样做?

我的 sed 是一个简单的 sed-for-windows-standalone-exe:

C:\dev>sed --version
super-sed version 3.59
based on GNU sed version 3.02.80

【问题讨论】:

    标签: windows sed


    【解决方案1】:

    GNU sed ( http://gnuwin32.sourceforge.net/packages/sed.htm ) 具有“二进制模式”的 -b 选项,即。 e.不要用 \r\n 替换 \n。

    如果您使用 cygwin 附带的 sed,那么即使没有 -b 选项,它通常也会使用二进制模式。也就是说,cygwin 命令使用输入文件路径来决定它们应该以文本模式还是二进制模式运行,即。 e.输出 \r\n 或 \n:http://www.cygwin.com/cygwin-ug-net/using-textbinary.html。 正如文档所说,二进制模式是 MS-DOS 路径名的默认设置,根据我的经验,默认挂载的文件系统也以二进制模式挂载。

    【讨论】:

    • 这个或@Kokkie 的较短版本应该是接受的答案恕我直言。他们实际上是在回答问题,而不是修补所产生的问题。最后,我可以使用 sed 加速在 Windows 机器上的 git repo 中进行大规模更改。
    【解决方案2】:

    如果您添加参数 -b 您将文件视为二进制文件,它不会更改您的行尾。 手册指出:

     -b, --binary
    
              open files in binary mode (CR+LFs are not processed specially)
    

    【讨论】:

      【解决方案3】:

      我不知道您如何在 Windows 上使用 sed 来做到这一点,但您是否尝试过:

      unix2dos you_file
      sed ...
      dos2unix you_file
      

      【讨论】:

      • 我知道 unix2dos...我只是不想先通过 sed 处理我的文件,然后再使用 unix2dos 解析它们。我想告诉 sed 使用 \n 作为换行符而不是 \r\n,尽管我正在使用 Windows 机器。
      • 这种方法的问题是:它增加了一个很可能不必要的处理层。我试图在 Windows 机器上的一个相当大的 git 存储库中进行一些大规模更改......每个文件都被标记为所有行已更改非常烦人,因此在 sed 本身中执行此操作要好得多。
      【解决方案4】:

      抱歉,sed 似乎无法按您的意愿工作,即 sed != awk(可配置)。

      我下载了ssed executable 并且帮助输出没有提到任何选项,我相信你知道。

      您可以尝试修改source code,或联系作者。

      通过阅读源代码中的NEWS文件,我发现

      * The s/// command now understands the following escape (in both halves):
      \a  an "alert" (BEL)
      \f  a form-feed
      \n  a newline
      \r  a carriage-return
      \t  a horizontal tab
      \v  a vertical tab
      \oNNN   a character with the octal value NNN
      \dNNN   a character with the decimal value NNN
      \xNN    a character with the hexadecimal value NN
      

      您是否尝试过将 `s/\r//' 作为脚本中的最后一个命令?

      我对大多数文本文件进行了快速扫描,但没有找到任何让我相信有一个 cmd-line 选项可以满足您的需求。

      由于您不想使用 unix2dos,出于最乐观的考虑,我提供了使用 tr 来清除那些讨厌的 '\r's 的选项

       sed -i -f yourSedScript yourFile
       mv yourFile yourFile.wrk
       tr -d '\015' yourFile.wrk > yourFile
      

      最后,如果你在 Windows 机器上编辑 Unix 文件,你必须通过 'ftp' 或类似的方式传输文件才能让你的 Unix 到 Windows,为什么不依赖 ftp 选项来转换行尾呢?

      我希望这会有所帮助。

      【讨论】:

      • 我没有传输文件。我正在编辑 C++ Builder 特定文件 (.dfm),尽管我正在使用 Windows 机器,但这些文件具有 Unix 样式的换行符。 `s/\r//' 不起作用,因为 sed 会再次将 \r\n 附加到每一行的末尾
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      相关资源
      最近更新 更多