Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316059
  • 博文数量: 90
  • 博客积分: 2850
  • 博客等级: 少校
  • 技术积分: 951
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-02 14:01
文章分类

全部博文(90)

文章存档

2015年(1)

2014年(1)

2013年(2)

2011年(3)

2010年(83)

分类: LINUX

2010-09-02 15:35:26

Linux中对文本文件批量替换
    (有关html语句部分成功替换 实例:下)

在linux系统上,可以使用命令ls -1 | xargs perl –I –p –e ‘s/替换后/替换前/’

常用例子:
sed 's/a/b/' /etc/passwd 将第1个a替换成b,g表明全局替换
sed -n ‘2p’ /etc/passwd 打印出第2行,p结合-n使用
sed -n ‘1,3p’ /etc/passwd 打印出第1到第3行
sed -e '1,10d' -e 's/yellow/black/g' x.txt :将x.txt中1~10行内容删除,
并将其它内容中的yellow替换为black
sed -e 's/yellow/blue/g' white.dat red.dat black.dat :
替换 white.dat、red.dat、black.dat 档内的 "yellow" 字串成 "blue"


任务:将文本hello中第一次出现的hello替换为wang,第二次出现的替换为yao
思路:
1.采用sed.
将模式空间(pattern space)的内容暂存入驻留空间(hold space).再将驻留空间的内容转入模式空间。(注:模式空间是单行的,采用它的多航模式,将内容存入驻留空间,使全部文本存入驻留空间,再拷贝回模式空间,进行替换操作)
2.采用awk.
设置RS(记录分割符)为""(空,即EOF),使全部文本变为一个记录,再进行字段操作,按照要求将字段进行替换。

#!/bin/sh
sed '{NH}g
s/\n//
s/hello/wang/1
s/hello/yao/g' $1


#!/bin/sh -f
awk '
BEGIN{FS=" ";RS=""}
{sub(/hello/,"wang")
gsub(/hello/,"yao")
}
END{print $0}' $1

1、网络上现成的资料

  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`

  linux sed 批量替换多个文件中的字符串

  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`

  例如:替换/home下所有文件中的为admin99.net

  sed -i "s//admin99.net/g" `grep -rl /home`

  exp:sed -i "s/shabi/$/g" `grep shabi -rl ./`

  2、自己额外附加

  2.1 将文件1.txt内的文字“garden”替换成“mirGarden”

  # sed -i "s/garden/mirGarden/g" 1.txt //sed -i 很简单

  2.2 将当前目录下的所有文件内的“garden”替换成“mirGarden”

  ## sed -i "s/garden/mirGarden/g" `ls` //其实也就是ls出多个文件名而已



find . -type f -exec sed -i '1,10s/string1/string2/g' {} \;
这个管用,将目录下所有文件(包括子目录的文件)中的string1替换成string2,不管文件是否有后缀名.

高级用法加perl,批量替换文件名为file.php的文件里面的某些内容:
find -name 'file.php' | xargs perl -pi -e "s|原内容|要替换的内容|g"

这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
替换字符:sed -i "s/old/new/g" /test
查找包含指定字符的文件名:grep aaa –ul /test



例一:
这两天在构建一个运用 的运用用到了maven,由于project很大,足足有700多个pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的 url,我须要把这些资源库的url统一指定到nexus本地中央库.
  手工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好要领 ,命令结构如下:
  find -name ‘要查找的文件名’ xargs perl -pi -e ‘被替换的字符串替换后的字符串g’
  下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”“替换为”“.
  find -name ‘pom.xml’ xargs perl -pi -e ’sg’
  这里用到了Perl语言,
  perl -pi -e
  在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
  从命令行中运用 Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地运用,将会为您省去大量的手工编辑工作。

例二:
常常查找匹配或替换多个文件中的关键字,可以用sed也可以用perl
sed -i -e ’s/aaa/bbb/g’ *
perl -p -i -e ’s/aaa/bbb/g’ *
或者用find传递参数
find ./ -name “*html” | xargs -n 1 sed -i -e ’s/aaa/bbb/g’

例三:
假如要将当前目录下的所有文件中的windows替换成linux,可以执行

find -type f | xargs perl -i -pe s%windows%linux%g
如果要匹配一个特定的参数,可以用perl,例如
perl -0ne ‘print “$2\t $1 ” while (/([^<]*)<\/a>/g)’ *.html


高级实例:


替换为:


[root@web1 yule]# sed -i "s###g" *html

替换仅限于 html目录和tools目录里的静态网页

改为:


改为:

[root@web1 yule]# sed -i "s###g" *html
[root@web1 yule]# sed -i "s###g" *html
[root@web1 yule]#

/chacha8/news/news/html
/chacha8/news/news/tools
目录下所有html页面 替换
替换之前,也做个备份?


=================

[root@web1 yule]# sed -i "s###g" *html
[root@web1 yule]# sed -i "s###g" *html
[root@web1 yule]#
[root@web1 yule]# cat index.html |grep ""

[root@web1 yule]# cat index.html |grep head


阅读(1409) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~