$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 编辑
' A+ S0 {% j. Q
( R" K) z- d# x1 Z& f6 jctags: linux perl shell perl  vi grep awk xargs  批量替换
, x9 Z2 q5 a- L: m4 a7 ]+ k% U- G5 a

6 o" C: ?- ^/ \7 C: A1 g
方法1:4 B5 _9 |: P( y, ?# k/ A8 C
8 P" r4 X0 F: ]& Y+ \
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
6 E3 q, S7 y/ ^手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
) e/ E& M% e3 a/ A8 W8 c  U/ Zfind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
% U6 a3 \9 a& zfind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
1 P+ L7 u+ D1 X( [$ Y2 Kperl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
* b3 T' A3 k3 S- Y0 {, L从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。$ A0 G9 {1 Y6 M4 h! g7 }6 @

$ @3 n) V9 y! [: |: a8 ?find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
( F6 j( g, L/ W# [ 2 [2 I8 K( o7 n( I$ V
方法2:( v0 W* W. ?( R' Z4 s' Y5 x

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。, p) P1 D6 o: M
用sed命令可以批量替换多个文件中的 字符串。 7 r9 c4 a" n% n+ x* u
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`6 x; {0 a, G6 w6 |3 I; i
例如:我要把mahuinan替换 为huinanma,执行命令: ) _" p+ K' L3 e9 |
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'' y0 o$ ~1 l' B, |. I$ S, K) ]
这是目前linux最简单的批量替换字符串命令了!; T6 D0 u/ h. @: M2 v- N! i
具体格式如下: & B7 P% j/ D4 N4 U+ F
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`
! W$ m7 D/ b4 {% Q# L实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`! s3 \. E- f, D# h: s0 j+ R( J
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

在日程的开发过程中,可能大家会遇到将某个变量名修改 为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:2 P  E. x: j/ L! Z
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
6 V& ], ]1 ~; o. y+ d
, `' M4 [) H  h. U3 S7 C, l$ J
from: http://blog.zol.com.cn/1395/article_1394052.html
* l  a# Q# U. i: ^4 Z) }
4 Q+ |& B: ~. a0 ?. H/ Z7 s补充说明0 p; k* l5 V8 |0 _% f
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`   
7 p; m* h6 i, \3 B7 c! I2 I对多个文件的处理可能不支持,需要用 xargs, 搞定。/ Y5 a0 t, Q* k
变种如下:
" N9 y! S" {% y8 R" n& _! w6 Hgrep
oldString -rl /path | xargs sed -i "s/oldString/newString/g" & z! V( t- n+ Y, I

" \  O; _$ k$ n: V( j- n. ?  J注意. s$ i& `$ d6 F$ W
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'+ H2 J$ d8 I, {6 V5 T0 V1 W

1 y+ s; Z3 a4 g6 q) X它山之石:
9 \, C& K) ~5 q* y+ [
( g( b5 W4 g8 [5 c5 y- H) r1:查找9 X$ M# \+ S" r$ S  a
find . -type f -name "*.html"|xargs grep ‘yourstring’: j/ m8 G( x, G( o
2:查找并替换
6 o  ]& A6 z3 H4 |find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'2 D4 z6 y- ]5 b/ }  \) Z
perl -pi -e
7 r) ^5 _* {& H7 Q2 R在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.. C' [/ f/ I. x/ x
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
; [8 A& P5 z0 u4 m9 E( c3:批量修改文件夹权限
0 }2 e% g1 Q2 ~3 r* Bfind . -type -d -name *.html|xargs chmod 755+ S, R) X  \4 B
4:批量修改文件权限+ n. ]2 g6 T: P3 m
find . -type -f -name *.html|xargs chmod 644
( B3 f+ j% x+ e' G: @查找和替换是很常用的操作。
. u4 m2 ^4 S" r5 B这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。# U' l) d5 P3 G
以例子进行说明/ j4 a5 J  x% P; Q* U: _' T
在当前目录下的.c文件中查找字符串"password"1 S* {& ^- c/ _2 Q4 n. e. Q- x& d8 |& S
grep "password" *.c
/ ]9 o! t7 a) ~# _( d5 O在当前目录及其多个子目录中查找文件test.c
- U9 }% `9 R: hfind . -name "test.c" -print, O/ K4 @7 a" q; @6 ?
在当前目录及其多个子目录中查找.vbs文件并删除之
6 y9 X+ y' [6 t* |find . -name "*.vbs" -exec rm {} \;2 G$ I5 H3 @7 ^' A6 x, D3 ?
在当前目录及其多个子目录下的.c文件中查找字符串"password"
' M6 E9 Y. T+ T+ N1 C6 w; ?$ ?find . -name "*.c" -print | xargs grep "password"
5 r6 m; p1 X' U在当前目录下的.c文件中把字符串"password"替换成"pwd"
# p8 J! g2 a' ^9 `, {" M* hperl -pi -e 's/password/pwd/g' *.c" w- N/ H0 x5 v# ]$ v
在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份
% w9 e6 m# _% `5 k- G# O4 [perl -pi.bak -e 's/password/pwd/g' *.c1 s) Z' P  b& Y  ~4 I7 U
在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
/ k. C) r" c* B! i1 ]1 Dfind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'
; L( W1 _% C- N/ ~6 j使用sed操作批量替换
: r* s1 W0 m% X% Y& E, W  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
7 G4 K& f2 O$ X# m  linux sed 批量替换多个文件中的字符串
8 X# ~9 B  |: ]  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`" V& F6 J0 [4 s2 N4 i( y
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com
" S% P0 c, d- a2 n) |# l  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites! x1 t$ W; \9 ?, K7 G5 l' v
   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" *
# B9 E! D' J, i# \  x8 v
9 }/ U( C9 Q6 b" Z% \参考: http://www.php318.com/show_137.html/ ?: B/ O" B/ g" |

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