答案1
^M 表示您正在 Windows 中引入/编辑文件。
dos2unix
对文件使用命令将它们转换为 Unix 文本模式。
DOS 使用回车和换行符“\r\n”作为行结束符,而 Unix 仅使用换行符“\n”。 ^M 是“额外”\r 字符的视觉表示。
要安装该dos2unix
命令,请执行以下操作(在基于 Debian 的发行版上):
sudo apt-get install dos2unix
或在 Mac (MacPorts) 中:
sudo port install dos2unix
或者,您也可以使用 sed 来执行此操作,如下所示:
sed 's/\r$//' dosfile.txt > unixfile.txt
答案2
join(1)
(至少我正在使用的版本)不会^M
向连接的文件添加或回车;join
但会很乐意复制^M
。十六进制查看器加上一些测试用例可以显示正在发生的情况:
$ echo "1 a" > test1
$ echo "1 b" > test2
$ join test1 test2 | od -bc
0000000 061 040 141 040 142 012
1 a b \n
0000006
$
^M
以及输入文件中有一个测试用例:
$ perl -E "say qq(1 a\r)" > test1
$ perl -E "say qq(1 b\r)" > test2
$ join test1 test2 | od -bc
0000000 061 040 141 015 040 142 015 012
1 a \r b \r \n
0000010
$
有多种方法可以纠正输入文件,此外dos2unix
还可以使用一种方法tr
(尽管如果文件使用古老的 MacOS 传统\r
作为行分隔符,这将是一个糟糕的主意):
$ od -bc test1
0000000 061 040 141 015 012
1 a \r \n
0000005
$ tr -d '\r' < test1 > foo
$ mv foo test1
$ od -bc test1
0000000 061 040 141 012
1 a \n
0000004
$