将 unix 文件的行结尾更改为 windows ^M 不起作用

将 unix 文件的行结尾更改为 windows ^M 不起作用

我有一个文件使用 unix 表示法作为行结尾,另一个文件使用 Windows 表示法。

当我查看viunix 文件时,我在行结尾处看不到任何内容。当我vi打开 Windows 文件时,我看到的^M是蓝色

在此输入图像描述

问题是从中间向下,这些行不包含^M蓝色(??)。

我正在尝试将整个文件转换为^M所有行。

我尝试了很多命令,但特别是这个

sed -e 's/$/^M/' < input.txt > output.txt

添加“^M”作为两个字符,而不是 as,Command-M它也会在已经具有正确^M字符的行上执行此操作...

我也尝试过

sed -e 's/\r/^M/' < input.txt > output.txt

sed -e 's/\n/^M/' < input.txt > output.txt

没有成功...

发出 acat -e input.txt我在 ^M 正确的行上看到了这一点:

1895;2;3;5;10;14;34^M$
1896;3;6;14;15;21;25^M$
1897;9;22;25;47;52;58^M$
1898;12;34;45;53;55;58^M$

这是关于不正确的

1899;20;23;35;36;44;48$
1900;8;11;27;28;43;46$
1901;11;12;26;30;37;53$
1902;02;07;09;18;21;25$
1903;09;10;15;28;43;45$

如何使用 command-m 获取所有行?

答案1

sed如果您有 Perl,那么使用它是避开不同版本等的最简单方法。

perl -pe 's/\r?$/\r/' < infile > outfile

或者就地:

perl -i.bak -pe 's/\r?$/\r/' infile 

这将在所有行的末尾添加一个回车符,除了已经有回车符的行之外。 (或者实际上,用 1 个 CR 替换 0 个或 1 个 CR:s。)


测试:

$ cat -e infile
with cr^M$
no cr$
still no cr$

$ perl -pe 's/\r?$/\r/' < infile |cat -e
with cr^M$
no cr^M$
still no cr^M$

$ perl --version
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
[...]

我想我在某处看到了 macOS 的提及。如果这就是您正在使用的,那么问题在于它sed附带的功能不支持 GNU sed 支持的一半内容。我的 Mac 上的那个似乎不支持\r\xHH...

但是您可以在命令行上粘贴文字回车符:

sed -Ee 's/^M?$/^M/' < infile > outfile

这里^M不是两个字符^M,而是单个回车符,shell(我想你会有 Bash)将其显示为^M。您需要输入字符Ctrl-VCtrl-M

或者,让 shell\r为您解释:

sed -Ee $'s/\r?$/\r/' < infile > outfile

$'...'几乎所有 shell 都支持该语法,尽管它不是标准的(据我所知))

答案2

UNIX2DOS在这种情况下应该适合你。然而,您似乎使用的是 macOS,它没有该程序的存储库,我建议sed -e 's/\n/\r\n/' < input.txt > output.txt这只是有点不太方便。

相关内容