$7.49 .com domain with free InstantPage Website Builder$1.99 Web Hosting   捷飞网络官方淘宝店   Godaddy 优惠码
返回列表 发帖
分享到:




[软件应用] linux批量替换文件内容3种方法(perl,sed,shell)

本帖最后由 jfx 于 2014-3-4 12:16 编辑
5 {0 h9 l: d1 Y% t7 y- M
6 i0 N( U# W9 u8 j/ U: U4 Fctags: linux perl shell perl  vi grep awk xargs  批量替换3 w- `7 n) y2 y; }. i  [

2 ]8 k3 |! l8 E6 t4 a3 {: o" s% `1 R( N- f
方法1:$ |+ i, M/ M) _, d4 m% X- B

( y2 d. E9 D- {* D+ f) w+ G) _5 n这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库./ ^) ]! F; ^" Z( {
手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:0 W$ x- d) L$ Y- Q6 I
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
( A% z# C' `  P+ Ifind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,5 S: @+ s# Y, O  _# @: v
perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.5 o7 q% F' E5 S6 V& s* q- }8 U7 S; g
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。* B' O! v* D( z. B" y' ^5 C
: E! [- g/ Q$ m& y3 [& O4 t  l
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
1 x/ J' D9 m+ T+ I& d8 z
5 {* S& u% l2 v5 O3 U' c1 s方法2:
2 z; C) ~; M/ Q( V& F

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。+ `. @* a" m( \6 M3 m: Z! Z& C/ M
用sed命令可以批量替换多个文件中的 字符串。
  H" p- y+ w  U! I2 W# A: u# s' xsed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`6 Z6 f4 j6 j) ?2 _- |$ ~
例如:我要把mahuinan替换 为huinanma,执行命令: * i: R* P8 W; p+ f1 m% _/ g
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
; g1 `  c: }, D) {2 z这是目前linux最简单的批量替换字符串命令了!. \' a2 {0 a( R% @# J! R, c# @
具体格式如下:
" s' C2 c: E% D2 U0 t$ N) xsed -i "s/oldString/newString/g"  `grep oldString -rl /path`. S  ~7 V8 B: m- w! M  q  ]( m, t
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`
9 U: C2 v1 S0 y# }
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

在日程的开发过程中,可能大家会遇到将某个变量名修改 为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
! ?; H2 P% C* W7 U( n
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'

# R2 z+ b8 r/ i# b; y( ?% p9 F1 k1 D. F! E" @. e
from: http://blog.zol.com.cn/1395/article_1394052.html$ B/ b. u# d2 B$ q" D
8 _, n# A8 m0 ^& r1 d9 E
补充说明2 P! m( i  U7 A) C' w: ?6 A
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`   
( x5 f6 {7 S! p对多个文件的处理可能不支持,需要用 xargs, 搞定。1 t" p, N4 H' R, [5 U
变种如下:3 ?/ ]- V+ X1 c. {" a
grep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"   q7 h8 z  z7 S$ f" A% R$ j
: w0 A% q" M) F% \5 j
注意$ `  t* \8 c% }
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'+ u' W7 ?. ~) A: \
) \/ ~4 z* o9 @# J
它山之石:4 v' H  Z6 E4 d
7 G' t/ v" V: W$ ~  h- L
1:查找( d$ [' A2 b8 `; G! `
find . -type f -name "*.html"|xargs grep ‘yourstring’
$ x7 `2 w( U0 f  |! H2:查找并替换
) L- r! R" L: z( G7 Qfind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
/ I( _+ ]3 h6 @/ \$ Y: _  O2 \perl -pi -e
) a3 O' }" g' y2 [1 X在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.8 D3 A7 {- d8 a  @% z
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。. m7 b" z1 Q. p) }" E6 e' {% C9 s+ u
3:批量修改文件夹权限
# s! ]$ Q3 o- ]find . -type -d -name *.html|xargs chmod 755
3 Z* S# }  Q2 `3 ?+ k4:批量修改文件权限& R5 |* D% q7 z- R3 y' u
find . -type -f -name *.html|xargs chmod 644( T( s( V# I0 J# r
查找和替换是很常用的操作。/ W4 a+ j, Z7 e  C. {% _' }
这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。1 C1 [8 P6 B  w2 i/ C- S9 e
以例子进行说明
4 U8 E6 u# b. \% ~2 g* {在当前目录下的.c文件中查找字符串"password"( x$ a. A% |# Z4 f! y3 q, V
grep "password" *.c, P: V. V4 Y$ N
在当前目录及其多个子目录中查找文件test.c
3 q7 L7 e7 }7 m) Pfind . -name "test.c" -print6 p+ u# k5 g: r! n
在当前目录及其多个子目录中查找.vbs文件并删除之
! W5 B4 _. O3 G3 v# l+ [find . -name "*.vbs" -exec rm {} \;, r2 D0 x) k5 w  S/ P* N2 y1 }3 {# }6 l
在当前目录及其多个子目录下的.c文件中查找字符串"password"
# V  t* M5 q. f0 ]$ n  H/ ufind . -name "*.c" -print | xargs grep "password"& `+ l0 b: p/ ~; f8 f- m- G
在当前目录下的.c文件中把字符串"password"替换成"pwd"9 X1 ]$ `5 T9 Y5 k: {
perl -pi -e 's/password/pwd/g' *.c1 r9 i+ v$ c# B5 ]5 N
在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份1 j) Y5 H- v# ?& [8 e
perl -pi.bak -e 's/password/pwd/g' *.c
2 ~+ G6 p* t$ _2 |. T. @4 M$ a在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
. z1 V' I! v6 J) c. G9 @  @/ D& kfind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'
# E0 r9 z  E: c使用sed操作批量替换
3 [" G0 ~% |9 x6 r9 Z3 G  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`4 g7 }7 X5 A7 H* f$ e& R$ }9 e$ r
  linux sed 批量替换多个文件中的字符串
" R2 Q6 p0 H9 X( e) s/ `8 i8 e8 U  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`( }: Z% W8 r7 J1 G/ [7 e% D7 V& Z
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com
$ K# r& f8 b& C" n6 x  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites3 K* P' }3 h5 ?/ f7 a- e
   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" * % I2 C7 Y9 q9 ~0 [) G
  C# c6 {% ?: m6 H/ z
参考: http://www.php318.com/show_137.html( X8 A  q* N$ V% k; n# Y$ B

美国VPS、域名代购:http://tu8l.taobao.com

返回列表
Namecheap
Namecheap.com - Cheap domain name registration, renewal and transfers - Free SSL Certificates - Web Hosting
互联网安全