去除CR行终止符。

7

首先,我想说我已经阅读了这篇帖子,但对于CR行终止符仍然有问题。

有一个名为build_test.sh的文件,我用leafpad编辑过,它可以在Vim中正确显示:

cp ~/moonbox/llvm-2.9/lib/Transforms/MY_TOOL/$1 test.cpp 
cd ~/moonbox/llvm-obj/tools/TEST_TOOL/
make
make install
cd -

然而:

  1. 使用 cat build_test.sh 输出什么都没有。
  2. 使用 more build_test.sh 输出:cd - install/llvm-obj/tools/TEST_TOOL/Y_TOOL/$1 test.cpp
  3. 使用 less build_test.sh 输出:cp ~/moonbox/llvm-2.9/lib/Transforms/MY_TOOL/$1 test.cpp^Mcd ~/moonbox/llvm-obj/tools/TEST_TOOL/^Mmake^Mmake install^Mcd -

file build_test.sh 的结果为:

build_test.sh: ASCII text, with CR line terminators

这篇文章的帮助下,^M已经不存在了,但是没有换行符 :-(
现在file build_test_no_cr.sh的结果为:

build_test_nocr.sh: ASCII text, with no line terminators

解决方案可在此处查看:这里
然而,我仍然想知道为什么cat不显示任何内容,more显示如此奇怪的结果。另外,为什么dos2unixset fileformat=unix在这种情况下失败了。
附注:我猜测可能是我的编辑器(Vimleafpad?)只生成\r而不是\n作为换行符。这是怎么回事呢?
3个回答

12

使用简单的\r作为换行符是“旧版Mac”中的行终止符,仍有编辑器在2012年及之后生成带有此类行终止符的文件实在很奇怪...无论如何,你可以使用dos2unix发行版中的mac2unix命令:

# Edits thefile inline
mac2unix thefile
# Takes origfile as an input, outputs to dstfile
mac2unix -n origfile dstfile

这个命令不会改变已经有正确行终止符的文件,这是一个优点。反过来的命令(unix2mac)也存在。

请注意,mac2unixdos2unix -c mac相同。

This command will not modify files that already have the correct line terminators, which is advantageous. There is also a reverse command (unix2mac).

Note that mac2unix is equivalent to dos2unix -c mac.


首先使用 leafpad 编辑 build_test.sh 文件(不要使用 Windows 或 DOS 操作系统)。然后执行 dos2unix build_test.sh build_test_nocr.sh 命令,运行 file build_test_nocr.sh 命令,得到的输出为 build_test_nocr.sh: ASCII text, with CR line terminators - Hongxu Chen
好的,我在语法上犯了一个非常严重的错误,实际上dos2unix会直接修改文件... 请尝试查看已编辑的帖子。 - fge
你是指 dos2unix build_test.sh 命令吗?没有效果。我已经更新了问题,希望你能解释一下 :-> - Hongxu Chen
嗯,看起来\r-only行终止符是旧的Mac风格终止符。你可以尝试使用mac2unix代替吗? - fge
1
我不确定,但我认为这与终端本身处理换行符的方式有关。在我看来,终端会将\n字符识别为换行符并在显示器上执行适当的操作,而它们会将\r显示为^M。终端(好吧,tty)是一个复杂的问题... - fge
显示剩余3条评论

12

另外,如果您使用vim,可以执行以下操作来强制使用UNIX行结束符

:set fileformat=unix
:w

或者只需添加

set fileformat=unix

添加到你的 .vimrc 文件中


不错,但所有文件都需要手动完成。 - Mohammad Faisal

6

我终于搞清楚了,我可以使用这个命令:

tr '^M' '\n' <build_test.sh >build_test_nocr.sh

在IT技术中,如果需要添加 ^M 这个字符,可以通过按下 Ctrl+vEnter 键来实现。或者也可以采用以下方法:

tr '\r' '\n' <build_test.sh >build_test_nocr.sh

好奇一下,CTRL-V 在终端上有什么作用? - wadge
@ddrjm通常表示“逐字插入”,请参见https://superuser.com/a/421468/88312 - Hongxu Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接