Linux下处理BOM头和^M的简单方法

简介:

Linux在网络服务器、嵌入式设备的市场上占有较大份额,Microsoft Windows在桌面操作系统上占有较大的份额,因此有很多的人喜欢用Windows去控制操作Linux。

既然用Windows去控制Linux,难免导致Windows系统上的产生的文件以某种途径传到了Linux系统中,因而导致显示问题或者出现乱码的情况。

例如用Windows自带的“记事本”(notepad)程序默认保存的文件会在每一行的结尾处带有^M标记。

PS: 一些常见的错误例子:有的人可能有疑问,为什么我用记事本把文件保存成UTF-8也不好用。还有的人在执行“sed -i '/^$/d' filename”时发现明明有空格却没有删除。

因此在日常使用过程中,无论是用什么工具编辑文件上传到Linux服务器,都需要注意换行符问题。

现象:

1.cat程序显示有问题

  如文件的开头显示“?t”

2.bash、python等文件执行时报错

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

  但是这种情况如果不想转换换行符,可以直接用相应的解释器去执行这个文件,如

1
/bin/bash  . /someshname .sh

3.其他应用程序如php、java等运行时报错

解释:

换行符(newline、line ending、end of line(eol)或line break),是一种控制字符,用于区分表示每一行的结束。换行符通常由line feed (LF)和carriage return (CR)两者中的一种或者它们的组合出现在计算机系统中,常见的换行符有三种:

  1. LF (UNIX and OS X \n)

  2. CR (Classic Mac \r)

  3. CRLF(Windows \r\n)

LF是Line Feed的缩写,CR是Carriage Return的缩写,他们的控制字符(\r,\n还是\r\n)由对应的ANSCII表示。

之所以出现“^M ”是因为^M在ANSCII中就表示Carriage Return即\r所以如果在Linux的某个打印输出中出现了^M,表示换行符是Windows格式的。

BOM是Byte order mark的缩写,释义为“字节顺序标记”,用于明确表明此文件属于Unicode编码,其他的一些作用可以参考维基百科的英文页面(显然中文页面解释的不全面)。

解决办法:

这个问题其实简单到没有必要用一篇文章的篇幅来表述,简答说就一句话:可以借助dos2unix 工具,将Windows格式的文本文件转化成Linux下可用的格式。但为了方便那些需要详细了解的人,特地多写几句如下。

# Remove BOM and ^M (BOM and ^M can come from Windows notepad program and save as 'ANSI' or 'UTF-8')    
# such as "example^M$", ANSI, ASCII text, with CRLF line terminators     
# such as "M-oM-;M-?example^M$", UTF-8, UTF-8 Unicode (with BOM) text, with CRLF line terminators     
# Linux right format is "example$", ASCII text     
# other method is using vim [noeol][dos] :set ff=unix

# determine file type  

1
file  testfilename

# display $ at end of each line, display TAB characters as ^I, use ^ and M- notation, except for LFD and TABo  

1
cat  -A testfilename

#Text file format converters. Convert text files with DOS or Mac line endings to Unix line endings and vice versa.   
# Debian & Ubuntu: apt-get install dos2unix     
# RHEL & CentOS: yum install dos2unix

# DOS/Mac to Unix and vice versa text file format converter   

1
dos2unix testfilename

关于显示乱码问题

1.有可能跟终端(SSH连接工具)有关系,尝试调整字符编码为utf-8

2.有可能是系统原因,如缺少中文支持

一些可用的参考:

Byte order mark https://en.wikipedia.org/wiki/Byte_order_mark

Newline https://en.wikipedia.org/wiki/Newline

ANSCII https://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters

tag:bad interpreter,移除BOM,dos2unix命令,CRLF,Linux换行符

--end--



本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1762675,如需转载请自行联系原作者


相关文章
|
3月前
|
Linux Perl
Linux中删除空行的三种方法
Linux中删除空行的三种方法
42 6
|
10天前
|
关系型数据库 MySQL Linux
linux CentOS 7.4下 mysql5.7.20 密码改简单的方法
linux CentOS 7.4下 mysql5.7.20 密码改简单的方法
17 0
|
17天前
|
Ubuntu Linux
常用Linux开机启动添加方法
常用Linux开机启动添加方法
13 1
|
1月前
|
安全 Linux 开发者
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
77 1
|
10天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
15 0
|
12天前
|
监控 Linux
|
16天前
|
存储 缓存 监控
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
|
16天前
|
Prometheus 监控 数据可视化
linux分析方法与技巧
【4月更文挑战第3天】在Linux环境中,进行日志分析和系统性能分析的关键方法包括:使用`cat`, `less`, `tail`查看和过滤日志,`logrotate`管理日志文件,`rsyslog`或`syslog-ng`聚合日志,以及通过`top`, `mpstat`, `pidstat`, `free`, `iostat`, `netstat`, `strace`, `sar`, `dstat`等工具监控CPU、内存、磁盘I/O和网络。对于高级分析,可利用Brendan Gregg的性能工具,以及Grafana、Prometheus等可视化工具。
16 2
linux分析方法与技巧
|
23天前
|
Linux
linux查看固有MAC地址的三种方法
linux查看固有MAC地址的三种方法
32 0
|
1月前
|
存储 Java Linux
Linux安装HBase的详细教程及常用方法
Linux安装HBase的详细教程及常用方法
75 1