shell-替换包名脚本

re_name_pakge.sh

old_packge_name=thoughtmechanix
new_packge_name=lianhe


#重命名
rename_dir()
{
    old_name=$1
    new_name=$2
    old_dir=$3
    echo exec rename_dir fun
    echo old_name ${old_name}
    echo new_name ${new_name} 
    echo old_dir ${old_dir} 
    
    new_dir=`echo $3 | sed 's/'${old_name}'/'${new_name}'/g'`
    echo new_dir: ${new_dir}
    
    echo mv -rf ${old_dir}  ${new_dir} 
    mv  ${old_dir}  ${new_dir} 
    sleep 2
}

#重命名所有目录
foreach_dir()
{
    old_name=$1
    new_name=$2
    echo exec foreach_dir fun 
    echo old_name ${old_name}
    echo new_name ${new_name} 
    export -f rename_dir  
    find ./* -type d  |sed -n '/^.{0,}com.thoughtmechanix.{0,}$/p'| awk  -v prm=${old_name} -v prm2=${new_name} '{
            cmd="rename_dir "prm" "prm2"  "$1
            system(cmd);
    }'
}

#替换所有java文件的包名
find ./* -type f |grep java|sed -n '/.java$/p'|xargs -i sed -i 's/com.thoughtmechanix/com.lianhe/g' {}
sleep 2
#重命名所有com文件夹下原包名,重命名为新包名
foreach_dir  ${old_packge_name}   ${new_packge_name}

新一版更好用

mkdir_subfun()
{  
      path3=$1
      echo "path:"${path3} 
      #如果目录不存在则wbh
      if [ ! -d ${path3}  ]; then
             mkdir ${path3}
        fi
}

mkdir_()
{    
     path2=$1
     export -f mkdir_subfun 
      echo  ${path2} |  sed  's/^[.]{1,1}///g' |sed  's/[/]{1,1}[^/]{1,}$//g' |sed  's///
/g' |sed  's/
$//g'|sed -n 's/
/v/;H;g;s/
///g;p'|sed  's/^/./g'| awk  '{
            cmd="mkdir_subfun "$1
            system(cmd);
     }'
}

subfun()
{
    path=$1
    echo exec subfun fun
    echo "path:"${path} 
    
    old_package="com.lianhe" 
    new_package="cn.com.linksmart" 
    new_base_path="./new/java/" 
    old_base_path="./"
    
    
    
    
    reg="./new/java/cn/com/linksmart/"
    
      reg2="t\/est"
     #echo reg2: [${reg2}]
     
     reg3=`echo  ${new_package}|sed  's/[.]{1,1}/\\//g'|sed  's/[;]{1,1}/\\//g'` 
     #echo reg3: [${reg3}]
     
      reg4=`echo  ${old_package}|sed  's/[.]{1,1}/\\//g'|sed  's/[;]{1,1}/\\//g'` 
     #echo reg4: [${reg4}]
     
    
     
     reg5=`echo  ${new_base_path}|sed  's///\\//g'` 
     #echo reg5: [${reg5}]
     
     reg6=`echo  ${old_base_path}|sed  's///\\//g'` 
     #echo reg6: [${reg6}] 
     
     reg7=`echo  ${old_package}|sed  's/[.]{1,1}/[.]/{1,1/}/g'` 
     echo reg7: [${reg7}] 
      
    
    new_path=`echo  ${path}|sed  's/'${reg4}'/'${reg3}'/g' |sed  's/^'${reg6}'/'${reg5}'/g'`
    echo new_path: [${new_path}]
      
    mkdir_    ${new_path} 
    cp -r  ${path}  ${new_path}
    echo      cp -r  ${path}  ${new_path}
        
    sed -i   -e 's/'${old_package}'/'${new_package}'/g'  ${new_path}   
}

fun()
{  
     #
     rm -rf ./new
     #windows 沙必方式只能一级一级创建目录再考贝
     mkdir ./new
     mkdir ./new/java 
      
     export -f subfun 
      export -f mkdir_
       export -f mkdir_subfun
     find ./*  -type f  | awk  '{
            cmd="subfun "$1
            system(cmd);
    }'
}
 
fun2

sed多行搜索例子(跨行搜索)

for i in {1..15}
do
    let num=$i;
    let c=$i+1
    if [[ $i -lt 10 ]] ;then
        v=0$i
    else
        v=$i
    fi
    if [[ $c -lt 10 ]] ;then
        cc=0$c
    else
        cc=$c
    fi

    echo v=$v
    echo cc=$cc

    cat en2 |sed  -n  '/'$v'-[A][.]/p' >> ok/$v.txt
    cat en2 |sed  -n '/'$v'-[A|B][.]/{:a;n;/'$cc'-[A|B][.]/!p;/'$cc'-[A|B][.]/!ba}' >> ok/$v.txt
    
done

 cat en2 |sed  -n '/'$v'-[A|B][.]/{:a;n;/'$cc'-[A|B][.]/!p;/'$cc'-[A|B][.]/!ba}' >> ok/$v.txt
解释一下

     

 -n 默认不打认所有
'$v'-[A|B][.]为开始标记正则 
'$cc'-[A|B][.] 为结束标记正则
/'$cc'-[A|B][.]/!p; 在两标记之间的行的处理方式,打印除结束标志所在行以外的所有行
:a;n;  :a意为自定义标签名 n;意为提交读取下一行。
!ba意为 !意为找取了结束标记 b意为跳出循环 a是前面自定义标签名:(如果找不到结束标签则继续跳到:a)




 
原文地址:https://www.cnblogs.com/heling/p/11505488.html