Shell应用(4): 使用sed删除行尾的^M字符

   由于从其它平台如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 @ 2013-08-08 19:06  cq12yue  阅读(15)  评论(0)    收藏  举报  来源