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

来源:互联网 发布:mysql 登录失败锁定 编辑:程序博客网 时间:2024/05/16 11:48

问题场景

  • 脚本文件本应该在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+MSYSTEM=`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+MSYSTEM=`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 oneSYSTEM=`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 twoperl -pi -e 's/\r\n|\n|\r/\r\n/g' $@ && echo 'successed' || echo 'failed'
0 0
原创粉丝点击