随笔-149  评论-223  文章-30  trackbacks-0
   由于从其它平台如windows传输文件到类unix平台时,用vim等编辑工具打开时,有时会发现行尾有^M,其实这就是控制字符CR,ASCII码为13。为方便删除这个字符,编写了一个简单的dos2unix脚本,最多带2个参数,特点如下:
   ● 第1个参数表示目标文件或目录,当为文件时则处理非脚本本身的文件,当为目录时则根据第2个参数是否递归处理子目录。
   ● 第2个参数当且仅当第1个参数为目录时有效,表示是否递归处理子目录,当为空时则不处理,为-r时则处理。
 1#! /bin/bash
 2# dos2unix
 3
 4self_name=$(basename "$0")
 5self_dir=$(cd "$(dirname "$0")";pwd)
 6
 7transform_file()
 8{
 9    name=$(basename "$1")
10    dir=$(dirname "$1")
11
12    if [ "$dir" = "." ]; then
13        dir=$(pwd)
14    fi
15
16    if "$dir" != "$self_dir" ] || [ "$name" != "$self_name" ]; then
17        mv $1 $1.old
18        sed 's/^M$//g' $1.old > $1
19        rm $1.old
20    fi
21}

22
23transform_dir()
24{
25    local pdir=$(pwd)
26    cd $1
27    
28    for s in `ls`
29    do
30        if [ -f "$s" ]; then
31           transform_file "$s"
32        else    
33           if -"$s" ] && [ "$2" -eq "1" ]; then        
34               transform_dir "$s" "1"            
35           fi 
36        fi            
37    done                
38
39    cd $pdir
40
41

42transform()
43{
44    if -"$1" ]; then
45        transform_file "$1"
46    else
47        if -"$2" ]; then
48            is_r=0
49        else
50            if "$2" = "-r" ]; then
51                is_r=1
52            else
53                echo "Usage: $(basename $0) directory -r"
54                return 1
55            fi
56        fi
57
58        if -"$1" ]; then
59            transform_dir "$1" "$is_r"
60        else
61            echo "$1 is neither file nor directory"
62            return 1
63        fi        
64    fi
65}

66
67if -"$1" ]; then
68    transform $1 $2
69else
70    echo "Usage: $(basename $0) file or directory [-r]"
71    exit 1
72fi
posted on 2013-08-08 19:06 春秋十二月 阅读(7469) 评论(5)  编辑 收藏 引用 所属分类: System

评论:
# re: shell应用(4): 使用sed删除行尾的^M字符 2013-08-09 09:20 | foyo23
这种情况经常碰到. 有用.  回复  更多评论
  
# re: shell应用(4): 使用sed删除行尾的^M字符 2013-09-03 20:58 | suwenqiang
直接使用vi的替换功能,更简单点
:1,$s/^M//g  回复  更多评论
  
# re: shell应用(4): 使用sed删除行尾的^M字符 2013-09-03 21:22 | 春秋十二月
@suwenqiang
vi需要先打开文件才行,既不方便,也不通用。  回复  更多评论
  
# re: shell应用(4): 使用sed删除行尾的^M字符 2014-11-05 11:17 | felix
楼主试过了吗?我这没成功  回复  更多评论
  
# re: shell应用(4): 使用sed删除行尾的^M字符 2015-05-20 16:06 | 春秋十二月
@felix
bug已修正  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理