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

Shell应用(4): 使用sed删除行尾的^M字符
   由于从其它平台如windows传输文件到类unix平台时,用vim等编辑工具打开时,有时会发现行尾有^M,其实这就是控制字符CR,ASCII码为13。为方便删除这个字符,编写了一个简单的dos2unix脚本,最多带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 -"$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 -"$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
67 if   - " $1 "  ]; then
68    transform $ 1  $ 2
69 else
70     echo  " Usage: $(basename $0) file or directory [-r] "
71     exit  1
72 fi

你可能感兴趣的:(Shell应用(4): 使用sed删除行尾的^M字符)