头图

a.txt的内容一共3行:
12345678
12345678
12345678

shell脚本:

for line in `cat a.txt` do
    echo ${line} 'abc'
done

for cat 遍历文本,用echo输出每行文字.
line=12345678
输出结果:abc45678
这个现象很奇怪,我们想要的结果是12345678abc才对

我们通过调试代码 echo ${#line} 可以看到,字符串line的长度是9.我们看到的内容长度其实是8.这个现象看起来很奇怪。
为了看个究竟,我们用vim打开文件a.txt,输入:set invlist。该命令可以看到文本中的隐藏字符,例如\r,\t等
image
我们看到,每一行结尾都有一个$符号,这个就是传统的\r回车符号,找到原因,我们就可以动手来解决:
我们修改代码如下

for line in `cat a.txt`
do
    echo ${line}abc |sed 's/\r//g' |sed 's/\n//g'
done

sed 命令可以把\r替换成空,同时后面把\n也替换一下。因为很多时候window编辑过的文件很就是带了\r\n。
以上是解决shell读取window编辑过的dos格式的文件末尾换行符问题,我们vim打开文件,输入:set ff? 可以看到文件格式:fileformat=dos 或者fileformat=unix
通过:set fileformat=unix可以转换格式
Unix格式的文本不存在以上问题。主要我们有时候有window编辑文本的需求,又需要适应脚本读取


第五城营
1 声望0 粉丝