Sed文本替换一例

使用 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/‘
时间: 2024-10-13 12:55:37

Sed文本替换一例的相关文章

深入浅出linux三剑客之sed必杀技一例

转 http://oldboy.blog.51cto.com/2561410/949365 缘起:上完培训课后,同学们对sed加正则处理问题的热情高涨,氛围相当好,但是,有个别同学还是有些晕乎,因此,撰写此文.此例如果搞熟练了,sed和正则的大部分常用技术你掌握起来就简单了. 如果还有不会的,老男孩就拿出最后的讲解必杀技(先保密,嘿!),同学们想不会那是不可能的,除非你们自己主动放弃,哈哈.来,开整~! 老男孩linux培训第三节课程课前第考试一题,问题如下 1.如何取得/etiantian文件

sed awk 样例

sed [options] '[action]' filename options: -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选项,则只会把经过sed命令处理的行输出到屏幕. -e:允许对输入数据应用多条sed命令编辑. -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出. actions: -a:追加,在当前行后添加一行或多行 -c:行替换,用c后面的字符串替换原数据行. -i:插入,在当前行前插入一行或多行. -d:删除,删除指定的行. -p:打印,输出指定的行

SED实用21例

Sed作业:1,删除文件每行的第一个字符.sed 's/.//' install.logsed -n 's/^.//gp' /etc/passwdsed -nr 's/(.)(.*)/\2/p' /etc/passwd2,删除文件每行的第二个字符.sed 's/.//2' install.logsed  's/(.)(.)(.*)/1\3\/' install.logsed -nr 's/(.)(.)(.*)/\1\3/p' /etc/passwd3,删除文件每行的最后一个字符.sed 's/.

Linux运维文本处理三剑客之sed命令

一· sed简介 与Vi等全屏编辑器不同,sed是一个非交互式的文本编辑器,它可以对文本文件和标准输入进行编辑,    标准输入可以来自键盘.文件重定向.字符串.变量,甚至来自管道的文本.sed是对文本中的行进行    逐行处理. sed只是对缓冲区中原始文件的副本进行编辑,并不编辑源文件.如何需要保存改动的内容,需要将输    出重定向到另一个文件,可以使用下面格式的命令: sed 'sed命令' input-file > result-file 二· sed调用的二种方式: 1.在shell

grep进阶与sed行编辑器

grep进阶与sed行编辑器 上一篇(http://nearlv.blog.51cto.com/2432295/1729198)我们介绍了grep的一些基本的使用方法,其它grep还是一些比较高级的用法,让我们一起来看看. 先来看一下下面例子的运行结果: 相同的命令输出的结果有点不一样,对,这里就是利用"alias"去设置命令的别名,语法格式为"alias="command""即可,可能通过直接在命令行输入"alias"查看当

《sed的流艺术之二》-linux命令五分钟系列之二十二

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 上文接:<sed的流艺术之一>-linux命令五分钟系列之二十一 5 sed中有选项么?有没有什么比较常用的? sed最主要的就是command部分,把这部分玩转了,你就已经很厉害了,而玩转这部分的前提是玩转正则表达式.尽管如此,sed的选项部分的-n选项仍然是非常重要,理解

sed应用

sed基本用法 1.1 问题 本案例要求熟悉sed命令的p.d.s等常见操作,并结合正则表达式,完成以下任务: 删除文件中每行的第二个.最后一个字符 将文件中每行的第一个.第二个字符互换 删除文件中所有的数字.行首的空格 为文件中每个大写字母添加括号 1.2 方案 sed文本处理工具的用法: 用法1:前置命令 | sed [选项] '编辑指令' 用法2:sed [选项] '编辑指令' 文件.. .. 相关说明如下: "编辑指令"可以为增删改查等指令 "定址符"用来定

sed多行文本处理

案例1:sed基本用法 案例2:使用sed修改系统配置 案例3:sed多行文本处理 案例4:sed综合脚本应用 1 案例1:sed基本用法1.1 问题 本案例要求熟悉sed命令的p.d.s等常见操作,并结合正则表达式,完成以下任务: 删除文件中每行的第二个.最后一个字符 将文件中每行的第一个.第二个字符互换 删除文件中所有的数字 为文件中每个大写字母添加括号 1.2 方案 sed文本处理工具的用法: 用法1:前置命令 | sed [选项] '条件指令' 用法2:sed [选项] '条件指令' 文

正则表达式sed学习(二)

sedsed是一个流编辑器,非交互式的编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)接着用 sed 命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.sed 要用来自动编辑一个或多个文件:简化对文件的反复操作:编写装换程序等 sed 增加 修改 查找 删除 增删改查 #查sed单行查询sed多行查询(地址范围)sed过滤功能 #增