$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 编辑   _# c& X7 j  a( E) {

5 E; a8 `; b4 _7 c+ H1 W- I( `ctags: linux perl shell perl  vi grep awk xargs  批量替换5 n& G: E  r5 o- ^. X
+ ~, R  D- Q" e9 H8 _3 m  P

8 G: g& i7 [8 f) f& g3 g6 C
方法1:
3 r" v! F; ?9 R& R1 t! _ 5 B( e0 }! N; f* ]: z7 G8 z' R2 A
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
' J6 g: N* m- D手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
4 l' S( {7 @$ ]find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.( [: l7 W; S5 H: u  [+ u
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
* k  ]- \: A2 _6 F" w' fperl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.4 t, D2 @! _9 v" u3 L
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
5 A+ i% S% G' H7 v7 O& d- D$ q
$ d" s! p1 C# T  T1 e5 R7 u3 ]
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
2 b$ e8 W% f0 {: q& m ' C( J" S( s1 A$ e( N
方法2:
4 J; l9 F4 \2 a6 V8 @" J6 h# w0 K

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
% L; x$ t, K/ X- u+ J% V2 [用sed命令可以批量替换多个文件中的 字符串。
. {3 }6 b2 S: c4 Y: t- r8 ~sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`- ]- ]& n7 u4 _  E
例如:我要把mahuinan替换 为huinanma,执行命令: ' h7 c5 x, v: Z" a; g5 r
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'' c( j7 p4 a4 N8 H9 w# H
这是目前linux最简单的批量替换字符串命令了!
2 b) P8 o) R1 _( R; y具体格式如下:
& q. ^# {  p' F* Fsed -i "s/oldString/newString/g"  `grep oldString -rl /path`# a1 Y) M# T" b
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`
; Z9 s4 ^0 \' o/ n  r
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

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

7 s2 H! H, A& zfrom: http://blog.zol.com.cn/1395/article_1394052.html6 i" a( I" U4 u: M! b$ H

6 ?8 [6 B* P+ n9 y4 u补充说明( h# k; e: J6 s( O8 x+ D
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`    1 I4 l9 {9 V2 n+ o. }( m5 z
对多个文件的处理可能不支持,需要用 xargs, 搞定。
8 R' `! W9 r) T: z- r变种如下:4 _% ]- ]0 J+ j* W+ U+ ]0 }
grep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
! A5 Q/ m( n! R+ D/ h- H9 v$ |3 K/ v. t5 g7 e
注意, v) w6 X/ a, `/ h; l3 {2 S) \
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'$ x# b& d  g( j

! t* z( ]2 Y) ?它山之石:
; E+ W7 Z# f$ ^8 f# y: ^! p
5 m, m1 a' }2 D  Z; M: U, |3 ?1:查找
- E1 X4 K' f( ?) \find . -type f -name "*.html"|xargs grep ‘yourstring’
8 O8 @3 `3 ~: P& G5 i) h2 t( ~! `$ j2:查找并替换; w' U) N3 I' }9 L% s4 W" ~
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'. B: C7 B( k7 k5 W$ Z' ?- \
perl -pi -e
! e3 s2 g! K! L( l! A* v+ c在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
" \9 u* f, D* E从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
- j7 q8 f3 i/ ]) Z$ m3:批量修改文件夹权限
" D! [" ?  |, N- j0 [3 O& r# xfind . -type -d -name *.html|xargs chmod 755
3 A0 I9 X2 {+ l/ H* f+ S4:批量修改文件权限9 k: D( m# r( E( f! x7 Q
find . -type -f -name *.html|xargs chmod 644
& {4 L3 ]' K! E查找和替换是很常用的操作。& m9 e5 w% O. f. e
这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。: ?# h! u6 S8 ?2 z0 M  n% F0 f6 G9 q. F
以例子进行说明
! ?& ^9 {  E& y! X" Z( N在当前目录下的.c文件中查找字符串"password"
3 {& ?( R2 y/ E7 ^% c: l- ngrep "password" *.c
0 ~  p6 c; d1 d- l  G0 l8 b在当前目录及其多个子目录中查找文件test.c
+ O! h/ y8 O3 M, y( t4 Ifind . -name "test.c" -print; b9 r0 D# r' [0 L2 W# |( q
在当前目录及其多个子目录中查找.vbs文件并删除之
& e; r6 @5 n/ l  K5 j& E* Z, ^5 cfind . -name "*.vbs" -exec rm {} \;; F6 G* x$ s3 M9 O9 ?5 O; a
在当前目录及其多个子目录下的.c文件中查找字符串"password"
: ~5 a; G9 P' i4 D% G" Efind . -name "*.c" -print | xargs grep "password"! G* w. F3 T7 S6 p
在当前目录下的.c文件中把字符串"password"替换成"pwd"
3 n. J6 O% q5 d9 f  \% `; y" p( Eperl -pi -e 's/password/pwd/g' *.c
3 O, u* Z* {( v- [9 [在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份9 ^6 `  Z# x1 Y9 Y, e! I
perl -pi.bak -e 's/password/pwd/g' *.c
( M( I; V5 a; f# x在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"5 V3 W: Y2 L( r6 d" l
find . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'
3 ?5 S+ H* v- k5 }6 h- V* K4 D4 w使用sed操作批量替换
" e; n! S/ W6 ~& E9 M* H- @2 T7 Y  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
. k$ p3 R3 U) n  linux sed 批量替换多个文件中的字符串, l2 w( J2 n9 h9 V/ D
  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
% k) i$ m) V  P  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com0 X4 W- F2 r/ W2 s6 O5 m  ?
  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites$ L! i3 r- T6 R- W: ?+ E- V* I
   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" * 2 \0 F. \0 j  j6 C! B  s$ v
. Y/ h2 z) c0 J4 o$ f
参考: http://www.php318.com/show_137.html
3 r! J8 ?8 K9 F6 z8 H' o+ T

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