如何将 Windows 行尾更改为 Unix 版本

Non*_*del 79 command-line bash

我们有 10 台装有某些版本的 Ubuntu 且只能远程访问的 PC。在对自定义软件进行一些升级时,我没有注意到某些脚本中的行尾是 Windows 版本 (CR+LF) 而不是 Unix 版本 (LF)。所以现在当我想启动脚本时,它给出了一个错误:

bash: /usr/local/bin/portsee: /usr/bin/python^M: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有没有办法从终端更改脚本中的所有行结尾。问题是我无法在这组 PC 上安装任何新软件。

hee*_*ayl 147

选项1: dos2unix

您可以使用dos2unix专门为此设计的程序:

dos2unix file.txt
Run Code Online (Sandbox Code Playgroud)

将替换所有线路中的所有 CR,就地操作。

要将输出保存在不同的文件中:

dos2unix -n file.txt output.txt
Run Code Online (Sandbox Code Playgroud)

您可能需要先通过以下方式安装它:

sudo apt-get install dos2unix
Run Code Online (Sandbox Code Playgroud)

选项 2: sed

或者您可以使用从行尾sed替换所有 CR ( \r):

sed -i.bak 's/\r$//' file.txt
Run Code Online (Sandbox Code Playgroud)

使用 option -i,文件将被就地编辑,原始文件将备份为file.txt.bak.

  • 我确实使用了 sed 命令并且它起作用了。谢谢! (8认同)
  • `dos2unix` 和 `unix2dos` 也存在于 cygwin 中 (3认同)
  • [这个答案](https://unix.stackexchange.com/a/279818/267627) 显示了递归应用`dos2unix`。将 git repo 从 windows 移动到 ubuntu 时很有用。 (2认同)
  • `sed` 对我有用,但必须提供全局标志,如下所示:```sed -i.bak 's/\r$//g' file.txt``` (2认同)

Mus*_*ron 6

sed解决方案并非可移植到所有平台。它在 macOS 上对我不起作用,除非我这样做brew install gsed并使用了gsed 's/\r$//'.

对于无需安装任何东西即可在大多数地方使用的解决方案,我使用

tr -d '\r'
Run Code Online (Sandbox Code Playgroud)

为了就地编辑文件,我在擦除和覆盖原始文件之前在子 shell 中生成新数据:

echo "$(tr -d '\r' < file)" > file
Run Code Online (Sandbox Code Playgroud)