sed 工具无法在 Windows powershell bash 中将 CRLF 转换为 LF

问题描述 投票:0回答:1

我有一个带有 CRLF 行结尾的文件,我需要将其转换为 LF。这个 sed 命令可以做到这一点:

sed -E -i "s/\r\n/\n/" file.txt
.

我已经使用 msys2 在我的 Windows 11 中安装了 sed。所以,如果我在 Powershell 中执行上面的 sed 命令,它会成功执行并将 CRLF 转换为 LF。

但是,如果我在 Powershell 中的 bash 中执行上面的 sed 命令,它会在控制台没有输出的情况下完成。但是它无法将 CRLF 转换为 LF。

相反,如果我运行 sed 命令来替换单词字符,它会在 Powershell 和 Powershell bash 中正确执行。所以我认为这与 bash 处理 CRLF 的方式有关。

现在,如何使用 sed 在 Powershell bash 中将 CRLF 转换为 LF?

bash powershell sed replace newline
1个回答
3
投票

在您的 WSL

bash
会话中使用以下命令,以便执行文件从
\r\n
(CRLF,Windows 格式)到
\n
(LF,Unix 格式)换行符(行尾)的就地转换:[1]

sed -i 's/\r$//' file.txt

或者,如果您不介意将文件作为一个整体阅读,使用GNU

sed
-z
选项和
g
正则表达式选项进行global匹配(查找all匹配):

sed -i -z 's/\r\n/\n/g' file.txt

您的问题与 PowerShell 无关;相反,您的 sed

 命令逻辑存在 
问题

  • sed
    默认情况下读取输入,并且removes每个尾随的换行符。

    • 因此,sed 脚本运行的
      no
      行默认包含
      \n
      ,因此尝试匹配
      s
      的替换(
      \r\n
      命令)总是 no-op
  • 因为

    sed
    只考虑
    \n
    (LF)alone换行:

    • 那些最初以
      \r\n
      结尾的行将结束
      \r
      (CR)当对它们执行
      sed
      操作时。
  • s/\r$//
    因此从每一行中删除尾随的
    \r
    ,并且-在将修改后的行写回文件时-以just
    \n
    终止每一行,因此实际上只有
    \n
    (LF)换行符仍然存在。


注:

  • 为什么 sed -E -i "s/\r\n/\n/" file.txt

     为你工作
    的唯一原因是 MSYS 附带的 sed
     实现具有 
    Windows 的特殊行为

    • On

      reading files, it recogns both \n

       (LF) 
      and \r\n
       (CRLF) as newlines.

    • 文件时,使用\n

      (LF)

    • 因此,它默认将 CRLF 序列转换为 LF

      ,下面的命令就足够了,即提供一个空脚本

      • sed -i ' ' file.txt

        
        

          注意:
        • sed -i '' file.xt
           
          应该 工作,即传递一个 空字符串 作为脚本参数,但不符合 PowerShell 7.2.x,因为长期存在的错误会意外 removes 空字符串参数调用 外部程序 时 - 有关详细信息,请参阅 GitHub 问题 #6280 这个错误的根本原因更突出地体现在无法传递参数
          with embedded "
           chars.
          to external programs - see
          this answer.
    • 由于上面解释的原因,

      s/\r\n/\n/

      实际上有
      no效果——在anysed
      实现。换句话说:
      只是 MSYS sed 实现的default
       行为恰好为您执行了所需的转换


[1] 要执行 相反 转换 - 从 LF-only 到 CRLF 换行符,请使用 sed -i 's/$/\r/' file.txt

,如 
jdweng 注释。

© www.soinside.com 2019 - 2024. All rights reserved.