在linux下运行shell脚本时会出现^M的问题

我是在win10下编辑的一个shell脚本,传到服务器上去后运行出错,用vi进去后发现每一行后面多一个^M,估计是win下和linux下换行符编码不一样导致的用网上说的set ff=uinx什么的方法好像没用

后来用下面这个解决问题

sed -i 's/\r$//' filename

sed 's/old/new/g’ ***

sed -i 's/      \r$   /   空    /'       filename

https://blog.csdn.net/ouyang_peng/article/details/86488451

解释:

使用方法:sed 参数 '动作du' 动作对象
如果用-i参数将修改文档的内容,

sed 's/\//\\\//g'这个我举一个类似的分析。
sed 's/old/new/g’ ***
这个就是把***文档里面的old这个词换成new这个词。
你的sed 's/\//\\\//g'里面既是把,/换成\/。

s/\//是一部分,/\\\//g又是一部分,s后面的//之间就是要替换的词语和上面的old类似,由于/有特殊定义,所以用\转意成普通符号/,

/\\\//g从第一符号到g前面的/之间就为替换old的new,为\\/前面两个\就是\没有特殊意义所以为\\,后面g前面的第二个/由于有特殊意义所以用\来转意,

所以new为\\/。在s/old/new/g里面的/为固定格式所需要的,所以想打印出/来的话,要用\来转意,linux特殊字符转意都用\。

为什么出现 ^M?

在Vim中解决这个问题,很简单,在Vim中利用替换功能就可以将“^M”都干掉,键入如下替换命令行:

  1)vi -b setup.sh

  2)在命令编辑行<就是: 按ESC键 然后shift+:冒号>输入:%s/^M//g

  注意:上述命令行中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”、“Ctrl+M”键生成的。

  这样替换掉以后,保存就可以执行了。当然还有其他的替换方式比如:

  a.一些linux版本有 dos2unix 程序,可以用来祛除^M。

  b.cat filename1 | tr -d “\r” > newfile 去掉^M生成一个新文件,还有sed命令等,凡是可以替换的命令都是可以用来新生成一个文件的。

当执行在Windows系统下修改过的脚本时,会提示存在^M的错误,但是在Linux下直接使用vim打开并不存在。此时可以使用vim -b来打开脚本文件,就可以发现每行的末尾都存在^M。

  造成这样的原因是不同的系统使用了不同的换行符。在Windows下文本文件的每一行结尾都有一个回车(‘\n‘)和换行符(‘\r‘);在Linux下文本文件的每一行结尾都有一个回车(‘\n‘);在Mac下文本文件的每一行结尾都有一个换行符(‘\r‘)。

  所以,当在Linux使用vim打开Windows编辑过的脚本时,^M代表的就是换行符(‘\r‘)。

  解决办法也很简单就是使用vim -b打开脚本文件,然后使用在交互模式下输入替换命令:%s/^M//g(注意:^M是由<Ctrl>+<v>和<Ctrl>+<m>打出来的),最后在交互模式下输入保存退出命令:wq即可。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值