$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 k1 n5 p9 p/ a; L3 X

  q1 `8 p4 q$ D* lctags: linux perl shell perl  vi grep awk xargs  批量替换. W8 Z6 X7 a1 x- V$ Y- A

- d0 ]) ~1 U6 a% U* \1 y. W$ X9 u+ J" Y5 J, U5 Y+ s, ^
方法1:
3 n+ k2 I! g* {+ B 1 q6 |( Y( b$ U: ?( a; }
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.3 r0 ^/ m, c2 I8 n9 G# h% u
手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
: S* Z6 C$ y5 v# P/ efind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.5 l5 a8 p8 w4 H2 @) e
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
3 j/ p  K1 @2 F, o& z* D7 Yperl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
0 V: P6 [5 L' _: E: b7 r6 w" S从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。# {1 C5 @1 g' A' s+ K3 @8 n" n

" p" C, V* w  K1 G) |) Ifind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'/ T' h3 @# C7 n- u8 C
. Q* r  l' ^6 i  g5 F2 ?
方法2:
' J- B6 `5 b( G& J. ^

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。0 A; F1 `- o+ J9 R- E# m1 T
用sed命令可以批量替换多个文件中的 字符串。
0 _5 p! x* M; A  c- D) I9 wsed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
! C* J4 j( Y" j& D) K例如:我要把mahuinan替换 为huinanma,执行命令:
- [3 ?9 x2 h3 x' A5 y, S1 fsed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
" G% s1 {3 `( ?1 P) ~) Q这是目前linux最简单的批量替换字符串命令了!
6 ~6 ^8 l1 J- R4 a具体格式如下: 2 S' I/ d6 k6 r. X$ _$ x8 x
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`
% w6 d% F: w7 K: |, {& E& O* ^! B实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`. U# `( Z+ q3 f/ M/ x# C# v" ~
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

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

% `9 y2 K# _; H) \' i/ o' hfrom: http://blog.zol.com.cn/1395/article_1394052.html
+ p+ E) X) v4 P8 p
/ F7 b: m% k- t/ H4 g补充说明
& T! `; V  V2 I9 E6 Q) E! M: ]: D; G
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`   
& _1 p1 x7 ]/ d# Q$ _对多个文件的处理可能不支持,需要用 xargs, 搞定。- D9 V6 M- B  z3 [
变种如下:9 p( j' b0 v) Y$ S( i6 a: @
grep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
- H; `4 \" h2 N" O5 ]0 {' w1 v- x4 f/ b6 F
注意
! j; K, @4 V) o) z- v
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前': B. u& k& d" ^: E) x8 H& I- V

1 r- t$ O& \/ D8 g9 j& F它山之石:
  d+ y/ O; T1 O! l% I3 g! s6 A: l0 @; A
1:查找
3 L0 K" z) H0 S# S6 K, Jfind . -type f -name "*.html"|xargs grep ‘yourstring’
) j! w' q# M2 n  K0 K6 Z  I* J+ G2:查找并替换9 ]7 f  x8 t, P% c  k% J7 |8 @$ Z
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
3 a% u/ G- I$ Zperl -pi -e! X) E) r; ]% W8 _- ~- d0 P
在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.) e# f; O7 |; R/ r: D) \2 N
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。* S9 _& q3 y$ \( {0 F
3:批量修改文件夹权限
" P* |% ~7 G; Y6 s0 ^, ?find . -type -d -name *.html|xargs chmod 755& W; J' ]5 v7 b" t! `  o8 @4 ]5 X8 w
4:批量修改文件权限9 s) z3 |9 H# o9 c
find . -type -f -name *.html|xargs chmod 644
8 X: V8 |+ _7 ]7 r查找和替换是很常用的操作。
( p4 l9 v/ N) D1 j  Q- d- z! C这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。. R4 w+ f) H( x% {2 Q7 ^5 O
以例子进行说明
7 e$ {) u$ D  J* v8 o7 O! e在当前目录下的.c文件中查找字符串"password"( b: g, \- E6 f! s$ U3 z- a
grep "password" *.c1 ~4 d( n% B8 v. G! y) M3 R
在当前目录及其多个子目录中查找文件test.c: m3 a7 _3 X, b$ H; m
find . -name "test.c" -print8 X: H  [0 x. i+ i6 @
在当前目录及其多个子目录中查找.vbs文件并删除之, q$ P! t0 e1 i2 X6 N& T3 v
find . -name "*.vbs" -exec rm {} \;& n! l/ |6 a: [3 Z1 x
在当前目录及其多个子目录下的.c文件中查找字符串"password"
: g' Z) L; g3 @# F/ S9 Bfind . -name "*.c" -print | xargs grep "password"; `/ P* Q: H# U  E/ P( q1 W: L* I/ E8 f
在当前目录下的.c文件中把字符串"password"替换成"pwd"+ o) H% v' X2 {4 ^$ b  I
perl -pi -e 's/password/pwd/g' *.c6 u; [. g" }9 _  v
在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份
& Z6 }* R* x" ?  aperl -pi.bak -e 's/password/pwd/g' *.c
* D1 `6 j: \( G# D8 W# N" N在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
/ Y0 [; O6 c, y3 Ofind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'- @( M3 i0 l( I. s1 g
使用sed操作批量替换
0 C2 X: s$ x% R" Q: `  q  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
) ~2 m  |7 |" T  linux sed 批量替换多个文件中的字符串2 U- L6 z5 \/ a( ~
  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
/ p* n5 W! f: D% d# t7 O( y  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com
* D: W) v; W8 Z  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
+ R) B+ C0 w. [) g   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" *
1 r: X* |: P- D" x& o; F1 I5 w* |, |- H1 t, a4 H
参考: http://www.php318.com/show_137.html! D+ M& G$ C. A, i7 V7 H

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

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