码迷,mamicode.com
首页 > 其他好文 > 详细

Sed文本替换一例

时间:2015-03-30 20:47:16      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

 

     使用 Sed 完成文本替换操作任务是非常合适的。

 

     现在, 假设我要将一个原有 Java 项目中的一些包及下面的类移到另一个项目中复用。

     Project javastudy:

     Packages:

          algorithm/ ,  foundations/,  javatech/, patterns/, threadprogramming/, datastructure/, javagui/, junitest3/, testdata/,  utils/

       这些包下面会有很多子包。

       现在要把这些包及其子包下面的所有 Java 文件移动到 Project ALLIN, 放在 package:  zzz.study 下面。

       在尝试使用 Eclipse 包重构无效之后, 我还是采用了原始的方案: 直接将 Project javastudy 的上述包复制到 zzz.study 下面。 复制之后, 要解决一个问题是: 必须手动更改每个 Java 文件的 package , import 引用。 比如 algorithm/BitsMapSort.java 中 

package algorithm.sort;

import java.util.Arrays;
import datastructure.vector.NBitsVector;

     

     必须改成:

package zzz.study.algorithm.sort;

import java.util.Arrays;
import zzz.study.datastructure.vector.NBitsVector;

 

     也就是说, 要将原来的 package packageName 和 import packageName 改成 package zzz.study.packageName ,  import zzz.study.packageName, 其中 packageName 取以下这些值: algorithm ,  foundations,  javatech, patterns, threadprogramming, datastructure, javagui, junitest3, testdata,  utils

 

     怎么办? 难道真的要手动修改这么多文件的包和导入引用么? 起初, 我试图用 awk 来完成这个任务: 

     $ cat addParentPkgName.awk

     $ awk -f addParentPkgName.awk BitsMapSort.java .

BEGIN {
        filename = ARGV[1]".tmp"
}
{
        if ($0 ~ /^(package|import) (algorithm|foundations|javatech|patterns|threadprogramming|datastructure|javagui|junitest3|testdata|utils).*/) {
                print $1" zzz.study."$2 >> filename
        }
        else {
                print $0 >> filename
        }

}

 

      可是 awk 不支持文件 in-place 修改, 这样我不得不去处理繁琐的文件回写和路径处理。于是想到了使用Sed. 注意到, 关键是匹配到 package|import packageName 即可。 可以使用分组和引用来完成。 命令如下: 

sed -r -i s/(package|import) (algorithm|foundations|javatech|patterns|threadprogramming|datastructure|javagui|junitest3|testdata|utils)(.*)/\1 zzz.study.\2\3/

 

    要批量完成多个文件的上述操作, 使用 find | xargs 即可:  

find . -name "*.java" | xargs sed -r -i s/(package|import) (algorithm|foundations|javatech|patterns|threadprogramming|datastructure|javagui|junitest3|testdata|utils)(.*)/\1 zzz.study.\2\3/

 

Sed文本替换一例

标签:

原文地址:http://www.cnblogs.com/lovesqcc/p/4379007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!