$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 编辑
3 y8 ?- Z2 N! {, i) R5 Y$ f/ i# ~6 z; L* z/ u9 Y
ctags: linux perl shell perl  vi grep awk xargs  批量替换3 m" ?% _3 x! o" Y/ j& V) A
+ d$ H3 M6 P& M3 I' W

+ L  W2 \3 M+ f4 X2 s# E& I
方法1:
% [# ]. U& a) O+ u* n) F# K, q + w8 K' }1 b4 i# q9 ]/ N9 L4 g
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
$ L# V( u1 _* U6 \+ d手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:- }& m/ l  ]" i  c: }. l, S
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.$ w: x  }! h1 d: ]1 x
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
; w, u7 t- [) w" X2 G' C9 Jperl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
* N/ Y4 ~6 B& z( o2 e) [从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
& L2 v) b$ p& M  ~% j: T0 `
6 e. s0 {, Z4 k8 v& J
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'. `% U6 y8 Q/ h

- }+ h/ a& X2 n2 `9 W方法2:
) A3 N& R' S5 @- M# ^* |

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。& i; ]+ p. I/ \$ Z
用sed命令可以批量替换多个文件中的 字符串。 0 F0 N/ N' O% ~. s0 E
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
# H) M0 t1 w& p; \! |$ X例如:我要把mahuinan替换 为huinanma,执行命令: . G5 N4 {3 [& l/ t
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www', j, H2 w; h7 A4 U
这是目前linux最简单的批量替换字符串命令了!
  f* Q% S2 e, N) T* q具体格式如下:
/ H9 ]2 o3 W$ H# _sed -i "s/oldString/newString/g"  `grep oldString -rl /path`
/ i* {- ~4 U) ^2 a' b6 E7 i) n7 W实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`4 B  P4 e6 |2 e, F, i
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

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

* w( n: |  I. n3 P) F, e% Q! x
( A+ N- e; J, D8 efrom: http://blog.zol.com.cn/1395/article_1394052.html
! N. J4 a" W/ N$ f5 Q
  p7 f& O/ h" g  b, u补充说明
, {8 f+ c4 d6 `: W% m9 C$ v
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`   
! c- [) }6 b/ _7 f! P4 s, l对多个文件的处理可能不支持,需要用 xargs, 搞定。* Y, c7 \) p' X6 ~2 L3 K
变种如下:
5 l, x/ u2 d( j" Ogrep
oldString -rl /path | xargs sed -i "s/oldString/newString/g" * A8 Q1 J2 s# v8 k$ R8 i; |

7 z1 W. L. ~' t& e: e注意
! A6 o3 A6 b3 X! @+ V. K
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'
- O* B* T8 Z5 Z$ j4 V) b3 D" G# v8 k, f$ o& Z: o. S
它山之石:
% g. W( d7 ~. p  s7 Q! \5 p9 v/ k! ?# }; X& n- p8 }
1:查找, l6 T: r" _! K2 G. i0 ~+ O
find . -type f -name "*.html"|xargs grep ‘yourstring’
8 @9 r9 Y: s. R2:查找并替换% g" I$ T0 L. K3 b$ C
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
) o- |1 D5 K7 l/ C) jperl -pi -e8 Y' c0 H, r' ~: M5 d
在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
+ y* }- Z6 n- I: s$ ~从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
" h' [* x6 K. X, {0 i) m3:批量修改文件夹权限
" E4 _+ R( R/ `# S8 e( ofind . -type -d -name *.html|xargs chmod 755
1 ^8 V2 r7 K9 ]" J! I  K; L4:批量修改文件权限& ^$ ]3 E" q+ ?" s: r2 ^& f  [+ P
find . -type -f -name *.html|xargs chmod 644$ Z9 ^6 |; S$ X1 o/ U0 y2 ?% t& J% R
查找和替换是很常用的操作。8 d0 W5 I, A5 n! v
这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。
$ M, `+ `2 Y( U" U2 d以例子进行说明3 ]3 ]' W5 G$ D0 K# y: O  ^
在当前目录下的.c文件中查找字符串"password"# [9 q) @$ ~) l' F) ^
grep "password" *.c
* Z2 P* z8 b- [0 u7 S! W在当前目录及其多个子目录中查找文件test.c. a1 y. |- x' x4 ^) u6 g5 A5 G
find . -name "test.c" -print
2 E5 R) w5 h+ @- G2 B/ H在当前目录及其多个子目录中查找.vbs文件并删除之, n& I5 b4 G, g" c( m+ X  z
find . -name "*.vbs" -exec rm {} \;7 f* |! t0 j8 T* M" p" }
在当前目录及其多个子目录下的.c文件中查找字符串"password"
2 z* N& V! Q# K2 J. {) V& |  Z0 o: q  nfind . -name "*.c" -print | xargs grep "password"  u3 v& t1 r4 q0 t8 o; L
在当前目录下的.c文件中把字符串"password"替换成"pwd"
. Z2 d8 Y  t% e  qperl -pi -e 's/password/pwd/g' *.c
4 t$ @  M  |/ N5 [7 A6 N在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份
& u. Q/ L3 {( p; ~" K3 K1 t0 X  ^perl -pi.bak -e 's/password/pwd/g' *.c- Q: r3 Q7 H6 `7 r
在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
/ N  x, N8 ?) v1 ~* z- Cfind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'
0 C8 u5 w$ }+ {( H使用sed操作批量替换
) \: h( V! ?. B( ?2 `( p* p  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`4 l- h0 u/ B$ k1 Y) A2 }" l1 d
  linux sed 批量替换多个文件中的字符串
3 C4 E5 `0 z7 S1 O  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
* c2 l' g5 c" q; A  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com! C/ D; D8 t: Z' k( A2 Y/ c
  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
) Q% p8 H$ Y) q   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" *
% t  S1 ^+ ]( @% I! V& f7 ], _/ g- r
参考: http://www.php318.com/show_137.html: x8 N7 O6 [$ N( m! Y# l

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