【问题标题】:remove CR line terminators删除 CR 线终结器
【发布时间】:2012-12-29 09:17:19
【问题描述】:

首先我想说我已经阅读了this post,但是我仍然对CR line terminators 有问题。

有一个文件叫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 会输出nothing
  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

this post 之后,^M 不再存在,但不再有换行符 :-(
file build_test_no_cr.sh 的结果现在是:

build_test_nocr.sh: ASCII text, with no line terminators

解决方法可见here

但是我仍然想知道为什么cat 什么都不显示而more 显示如此奇怪的结果。另外为什么 Vim 中的 dos2unixset fileformat=unix 在这种情况下会失败

ps:我猜我的编辑器(Vimleafpad?)可能只为换行生成 \r 而不是 \n。怎么会这样?

【问题讨论】:

    标签: shell unix newline dos


    【解决方案1】:

    换行符的简单\r 终止符是“旧Mac”行终止符,奇怪的是2012+ 的编辑器甚至生成带有这种行终止符的文件...无论如何,您可以使用mac2unix 命令,即dos2unix 分布的一部分:

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

    此命令不会删除已经预期行终止符的文件,这是一个奖励。反过来(unix2mac)也存在。

    注意mac2unixdos2unix -c mac 相同。

    【讨论】:

    • 这很奇怪,这个命令一直对我有用。想知道你是如何尝试使用它的吗?
    • build_test.sh 是首先使用leafpad 编辑的(不是来自Windows 或dos OS)。我只使用dos2unix build_test.sh build_test_nocr.shfile build_test_nocr.sh 告诉我build_test_nocr.sh: ASCII text, with CR line terminators
    • 你说这“不是来自 Windows 或 dos 操作系统”——那是什么操作系统?
    • 好的,我在语法上犯了一个非常严重的错误,实际上dos2unix修改了文件......尝试查看编辑后的帖子
    • 我不太清楚,但我认为这与终端本身处理换行符的方式有关。如我所见,终端会将\n 字符识别为换行符并在显示屏上执行适当的操作,而它们会将\r 显示为^M。终端(嗯,ttys)是一件复杂的事情......
    【解决方案2】:

    另外,如果你使用 vim,你可以通过执行来强制 UNIX 行结束

    :set fileformat=unix
    :w
    

    或者只是添加

    set fileformat=unix
    

    到你的 .vimrc 文件

    【讨论】:

    • 不错的一个。但这将对所有文件手动完成。
    【解决方案3】:

    我终于想通了,我可以使用这个命令:

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

    其中^M 是通过按Ctrl+vEnter 键添加的。或者,这具有相同的效果:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多