linux vi界面的撤销是,如何取消Linux下,vi中显示的^M符号

如何取消Linux下,vi中显示的^M符号

执行一个脚本full_build.sh 时, 一直是提示我:

-bash: ./full_build.sh: /bin/bash^M: bad interpreter: No such file or directory

开始是说我权限不够, 不能执行, 接着我就把权限给改了,  就一直报上面问题.

记得几个月前, 就遇到过类似的问题, 当时是在编译Android Framework, 后来打开出错的.xml文件, 很直接的看到很多的^M的标识,由于负责编译的同事帮忙解决了, 就没有去问为什么, 今天再次遇到, 就上网搜了搜, 才明白了原因.

出现上面错误的原因之一是脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 使用vim编辑器打开脚本, 运行:

:set ff?

可以看到DOS或UNIX的字样. 使用set ff=unix把它强制为unix格式的, 然后存盘退出, 即可.

网上也有很多的其他方法, 比如: 执行dos2unix 命令转换编码,   命令为: #dos2unix full_build.sh,  但我没有dos2unix的安装包, 所以就跳过了.

也有说造成这种问题的原因是在使用vim时不小心按了个: Ctrl+v,  脚本是我从服务器上下的, 不清楚到底怎么会变成了DOS格式的了. 总之解决了就行啦.

【背景知识】

^M 是ascii中的'\r', 回车符,是16进制的0x0D,8进制的015,十进制的13。

对于换行这个动作,unix下一般只有一个0x0A表示换行,windows下一般都是0x0D和0x0A两个字符。

另外:^L 是ascii 0x0C '\f', 换页控制符。

而对于Linux 的vi,有些版本,比如我当前开发板里面的vi,是用busybox编译出来的,不能识别windows下面编辑的,带0x0D的那些文本文件,所以,你在windows下面编辑一个普通的文本文件,如果里面有换行,那么在Linux的vi里面,对应的那个0x0D就会显示出一个^M,比如:

1. led on & off^Meg.^Mecho none > /sys/class/leds/led_green/trigger^Mecho 1 > /sys/class/leds/led_green/brightness^Mecho > /sys/class/leds/led_green/brightness^MNote: the default switch of trigger is [none]^M2. heartbeat flash^Meg.^Mecho heartbeat > /sys/class/leds/led_green/trigger^M3. timer flash^Meg.^Mecho timer > /sys/class/leds/led_green/trigger^Mecho 5 > /sys/class/leds/led_green/delay_on^Mecho 5 > /sys/class/leds/led_green/delay_off^M

每行最后都有一个^M,很是难看,所以想要去掉。

注:普通PC版本的Linux,好像可以很好地识别了,比如我的Linux服务器,OpenSUSE下面的某个版本vi的,可以很好地显示那些windows下面编辑的,带0x0D的回车换行符,不能出现^M。

此外,关于ASCII字符,Linux下面有个简要的介绍:

[crifan@linux-41lh wi-fi]$man ascii

ASCII(7)                                            Linux Programmer's Manual                                           ASCII(7)

NAME

ascii - the ASCII character set encoded in octal, decimal, and hexadecimal

DESCRIPTION

ASCII is the American Standard Code for Information Interchange. It is a 7-bit code. Many 8-bit codes (such as ISO8859-1, the Linux default character set) contain ASCII as their lower half. The international counterpart of ASCII isknown as ISO 646.

The following table contains the 128 ASCII characters.

C program '\X' escapes are noted.

Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char

------------------------------------------------------------------------

000   0     00    NUL '\0'                    100   64    40    @

001   1     01   SOH (start of heading)      101   65    41    A

002   2     02    STX (start of text)         102   66    42    B

003   3     03    ETX (end of text)           103   67    43    C

004   4     04    EOT (end of transmission)   104   68    44    D

005   5     05    ENQ (enquiry)               105   69    45    E

006   6     06    ACK (acknowledge)           106   70    46    F

007   7     07    BEL '\a' (bell)             107   71    47    G

010   8     08   BS '\b' (backspace)        110   72    48    H

011   9     09    HT '\t' (horizontal tab)   111   73    49    I

012   10    0A    LF '\n' (new line)         112   74    4A    J

013   11    0B    VT '\v' (vertical tab)     113   75    4B    K

014   12    0C    FF '\f' (form feed)        114   76    4C    L

015   13    0D    CR '\r' (carriage ret)     115   77    4D    M

016   14    0E    SO (shift out)             116   78    4E    N

017   15    0F    SI (shift in)              117   79    4F    O

。。。。。。。。。。。

【如何消除vi中的^M】

我刚开始去用sed命令:

sed 's/^M//g' file_old > file_new

不成功,输出的文件,用vi打开,还是带^M。

后来到网上搜到了可以用的办法,用tr命令:

tr -d "\015" < myfile.txt > myfile_new.txt

可以把符号^M(即"\015")去掉,并另存为新文件myfile_new.txt

【后记】

根据别人的建议,知道了还有个专门的工具dos2unix和unix2dos,用于处理这方面的事情,详情参考:

【转】dos2unix和unix2dos命令使用

其用法很简单,直接使用即可:

dos2unix file_name

这样就可以把该文件里面的0x0D去掉了,只保留0x0A。

【引用】

1。如何取消vi中显示的^M符号

2。Linux 下用程序新建的文件中出现^M字符,如何消除??

http://www.linuxforum.net/forum/printthread.php?Cat=&Board=program&main=32848&type=thread

3。[请教]用vi编辑文本时出现的^M和^L代表什么?

http://www.linuxsir.org/bbs/thread305370.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值