脚本实现文本文件在Linux、mac与window下的正常显示

问题场景

  • 脚本文件本应该在Linux下编辑,但是有时候会在Windows下用记事本新建超过一行的脚本文件test.sh,此时传入test.sh到Linux或者mac执行之后有时会报错;
  • 在Linux或者mac下新建多行的文本文件a.txt,传入Windows下打开只有一行

原因

Windows、Linux、mac三种操作系统的换行符没有统一。
- Windows:CRLF(\r\n或0d0a)
- Linux: LF(\n或0a)
- mac: CR(\r或0d)

解决方式

针对第一种场景,Windows下的换行符比其他OS(仅区分常见Linux(Ubuntu、centos、suse、Redhat等)与mac,如果想区分更多类型的操作系统请点击这里之后改写脚本)多了一个字符,那么只要把多余的字符用空串替换掉即可,注意脚本支持多个文件但会覆盖掉原文件。

#!/bin/bash
# method one
#^M的输入方式,Ctrl+V Ctrl+M
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ]; then
    sed -i 's/\r//g' $@ && echo 'successed' || echo 'failed'
elif [ $SYSTEM = "Darwin" ]; then
    sed -i '' 's/^M//g' $@ && echo 'successed' || echo 'failed'
else
    echo "unknown os"
fi
#!/bin/bash
# method two
#^M的输入方式,Ctrl+V Ctrl+M
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ]; then
    perl -pi -e 's/\r\n|\n|\r/\n/g' $@ && echo 'successed' || echo 'failed'
elif [ $SYSTEM = "Darwin" ]; then
    perl -pi -e 's/^M//g' $@ && echo 'successed' || echo 'failed'
else
    echo "unknown os"
fi

针对第二种场景,其他OS(仅区分常见Linux(Ubuntu、centos、suse、Redhat等)与mac,如果想区分更多类型的操作系统请点击这里之后改写脚本)比Windows少一个字符,只要把每一行的末尾替换成相应字符即可,注意脚本支持多个文件但会覆盖掉原文件。

#!/bin/bash
# method one
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ]; then
    sed -i 's/$/\r/g' $@ && echo 'successed' || echo 'failed'
elif [ $SYSTEM = "Darwin" ]; then
    sed -i '' 's/$/\n/g' $@ && echo 'successed' || echo 'failed'
else
    echo "unknown os"
fi
#!/bin/bash
# method two
perl -pi -e 's/\r\n|\n|\r/\r\n/g' $@ && echo 'successed' || echo 'failed'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值