Shell应用(4): 使用sed删除行尾的^M字符
   由于从其它平台如windows传输文件到类unix平台时,用vim等编辑工具打开时,有时会发现行尾有^M,其实这就是控制字符CR,ASCII码为13。为方便删除这个字符,编写了一个简单的dos2unix脚本,最多带2个参数,特点如下:
● 第1个参数表示目标文件或目录,当为文件时则处理非脚本本身的文件,当为目录时则根据第2个参数是否递归处理子目录。
 
● 第1个参数表示目标文件或目录,当为文件时则处理非脚本本身的文件,当为目录时则根据第2个参数是否递归处理子目录。
   ● 第2个参数当且仅当第1个参数为目录时有效,表示是否递归处理子目录,当为空时则不处理,为-r时则处理。
 1
#! /bin/bash
2
# dos2unix
3![]()
4
self_name=$(basename "$0")
5
self_dir=$(cd "$(dirname "$0")";pwd)
6![]()
7
transform_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![]()
23
transform_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 [ -d "$s" ] && [ "$2" -eq "1" ]; then        
34
               transform_dir "$s" "1"            
35
           fi 
36
        fi            
37
    done                
38![]()
39
    cd $pdir
40
} 
41![]()
![]()
42
transform()
43
{
44
    if [ -f "$1" ]; then
45
        transform_file "$1"
46
    else
47
        if [ -z "$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 [ -d "$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![]()
67
if [ -n "$1" ]; then
68
    transform $1 $2
69
else
70
    echo "Usage: $(basename $0) file or directory [-r]"
71
    exit 1
72
fi
#! /bin/bash2
# dos2unix3

4
self_name=$(basename "$0")5
self_dir=$(cd "$(dirname "$0")";pwd)6

7
transform_file()8
{9
    name=$(basename "$1")10
    dir=$(dirname "$1")11

12
    if [ "$dir" = "." ]; then13
        dir=$(pwd)14
    fi15

16
    if [ "$dir" != "$self_dir" ] || [ "$name" != "$self_name" ]; then17
        mv $1 $1.old18
        sed 's/^M$//g' $1.old > $119
        rm $1.old20
    fi21
}22

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

39
    cd $pdir40
} 41


42
transform()43
{44
    if [ -f "$1" ]; then45
        transform_file "$1"46
    else47
        if [ -z "$2" ]; then48
            is_r=049
        else50
            if [ "$2" = "-r" ]; then51
                is_r=152
            else53
                echo "Usage: $(basename $0) directory -r"54
                return 155
            fi56
        fi57

58
        if [ -d "$1" ]; then59
            transform_dir "$1" "$is_r"60
        else61
            echo "$1 is neither file nor directory"62
            return 163
        fi        64
    fi65
}66

67
if [ -n "$1" ]; then68
    transform $1 $269
else70
    echo "Usage: $(basename $0) file or directory [-r]"71
    exit 172
fi
                    
                


                
            
        
浙公网安备 33010602011771号