从 Windows 到 Unix 的 FTP 之后附加的脚本中删除特殊模式 ^M

从 Windows 到 Unix 的 FTP 之后附加的脚本中删除特殊模式 ^M

我使用 FTP 将 Windows 文件发送到 Unix 系统,并^M在需要换行的地方附加了该文件,而我只想删除它们。

我可以选择的一种方法是运行dos2unix命令。

任何人都可以建议另一种方法(例如sed命令)来删除此类模式吗?

答案1

Windows 行结尾由两个字符序列 CR、LF 组成。 CR 是回车符,有时表示为\r\015^M等。Unix 行结尾就是 LF 字符。

仅使用所有 Unix 变体上存在的标准实用程序将 Windows 行结尾转换为 Unix 行结尾的方法是使用tr公用事业。

tr -d '\r' <thefile >thefile.new && mv thefile.new thefile

如果文件已经具有 Unix 行结尾,则其内容不会更改。

如果当前目录中有很多文件要转换,则可以使用循环。假设您没有任何名称以以下结尾的文件.new

for x in *; do
  tr -d '\r' <"$x" >"$x.new" && mv "$x.new" "$x"
done

在Linux(不包括一些嵌入式Linux系统)或Cygwin下,可以使用sed。就地编辑文件的选项-i特定于这些系统。 CR 字符的表示法\r更为广泛,但并不通用。

sed -i -e 's/\r//g' thefile

答案2

DOS2UNIX:

sed -i -r -e 's/\r$//' file

UNIX2DOS:

sed -i -r -e 's/$/\r/' file

答案3

sed -i -r -e 's/\r$//' file对于“dos2unix”优于sed -i -e 's/\r//g' file

对于后者,如果我在 classic-mac 样式文件(其中换行符为 '\r')上运行它,那么新文件不仅不是 Unix 样式,而且根本没有换行符。一切都将排成一行。

编辑:同样,正如评论中提到的,它也比 更可取sed 's/^M//g' file,因为 ^ 符号是行开头的 sed 代码,因此这会删除行开头的每个 M 。我创建了一个文本文件,其中几行只有一个前导 M,并且使用该 sed 命令,除了换行符之外什么也没有作为输出。

答案4

使用sed:

sed 's/^M//g' filename > newfilename

相关内容