$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 编辑 " |7 B: _( k9 v3 ]* b+ X4 b4 Z

) f# F" t9 D1 @3 n. Lctags: linux perl shell perl  vi grep awk xargs  批量替换
$ x6 P+ J( j5 Y' I( o. C/ C) M7 t4 z7 m

" R; _1 ]; D0 y: J" u
方法1:
0 t3 ~- e6 T( m; f4 F) W " W, `, z  k* N: O  e, W/ s
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.! S. d9 `1 L3 W) x3 p1 K4 b% ]
手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
5 Y9 K! j( J- `" `: K2 d3 ufind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
' ?. Q  Y$ [% ?find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
' _% F% b7 @( l2 I# D; Kperl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
( z% O& k8 N3 J3 Q/ h7 C从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
# x. i3 T# W: c& k$ q: ^+ L

2 w1 K' G+ b- d! F, U" J: lfind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
3 K6 K# N" n$ J- @% z' `& f6 L 4 J2 I7 K2 h4 ]5 T
方法2:
. ?3 R, o8 _+ U; j, R9 O5 s' @4 K

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
7 V, [. q2 m7 ?( |' ~" K; Z4 S用sed命令可以批量替换多个文件中的 字符串。
& `* D( C) }' Fsed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
' F# a4 S, G3 s例如:我要把mahuinan替换 为huinanma,执行命令:
1 p3 H2 C" @, }9 ]sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
6 u1 k& y" r7 k) b% [这是目前linux最简单的批量替换字符串命令了!- y3 x' O, e, b: q3 _, F% |( U* f
具体格式如下: ' N. N2 K1 _1 W* @3 C
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`1 n% K6 `. ?- Y! t
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`4 U- D; u, t  N
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

在日程的开发过程中,可能大家会遇到将某个变量名修改 为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
% c, P- l+ M( Q0 ?
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
: M9 Z( r- O' k6 z
0 N" i& v" O- B$ m
from: http://blog.zol.com.cn/1395/article_1394052.html2 _! R2 c3 V' f! A

+ A- p+ n0 Q* R- |) U2 R" n补充说明
  n6 P! [1 _+ n0 H& V( O
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`   
4 r5 r$ b% c+ @" i对多个文件的处理可能不支持,需要用 xargs, 搞定。* c) j2 y; [3 x' `# O
变种如下:
& c9 A" }# d) A/ I* ~grep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
& _2 L2 l' t: k( v  ]" M% ?# V' o. @* I4 Z/ U
注意3 H& b6 Q1 N4 D  Q0 e2 U
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'
5 x5 E7 ?0 V. m5 n/ F: e3 ~) K* q& p, w( D" z
它山之石:
6 `' v' B- i9 A' f& A6 i$ T8 X# u2 D1 y9 Q% T5 v6 O& h7 Q6 h
1:查找
7 W' g) L$ J. V4 g9 @* j4 cfind . -type f -name "*.html"|xargs grep ‘yourstring’8 n) s+ a7 J! t6 ~- f5 ]
2:查找并替换
( a7 u4 }' _! D8 g- r( i0 Xfind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
) p! U+ {- U7 o2 Lperl -pi -e! _! k+ o, }( s# O. S# I! h5 I/ V6 j
在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
, _) a& ?  b+ ~2 W; t! k' M( L从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
2 o, \. r: r& Y$ h, z; p% ~0 v3:批量修改文件夹权限% ~4 v, H. J9 ]/ F& N1 V
find . -type -d -name *.html|xargs chmod 755
8 e! \! c& a& S5 O4:批量修改文件权限
# f4 u" Z- u( w" z; [( i4 Nfind . -type -f -name *.html|xargs chmod 644" \+ \0 l. s0 D
查找和替换是很常用的操作。
' ^; c: k* \) v5 |6 b这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。
" N' I: u( _2 C+ U/ l8 T以例子进行说明. \5 f2 |$ C$ o" d
在当前目录下的.c文件中查找字符串"password"
) E: p) @# ^7 X$ t3 p2 ~grep "password" *.c
: _9 I/ H5 z4 P' x4 _( E5 F3 N在当前目录及其多个子目录中查找文件test.c
& X, u! Y) A  G  r/ f0 T2 mfind . -name "test.c" -print
: [* q  R6 G% p. ~在当前目录及其多个子目录中查找.vbs文件并删除之
8 e! W% u/ d" }% E4 b  `$ bfind . -name "*.vbs" -exec rm {} \;
5 D. _3 B0 ?9 H: {在当前目录及其多个子目录下的.c文件中查找字符串"password"+ U3 q: ^) W. G- w- a
find . -name "*.c" -print | xargs grep "password"; E2 y# z) l. U
在当前目录下的.c文件中把字符串"password"替换成"pwd"
& ?* {7 f2 q$ }" d8 F8 Iperl -pi -e 's/password/pwd/g' *.c6 T2 I* [# W  k# I' {8 C& N5 n
在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份3 ~8 w" c+ c; E  f
perl -pi.bak -e 's/password/pwd/g' *.c/ k9 U4 h- Y. g, L8 e3 ^* A
在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"8 l% J" p6 f0 M4 J8 ?; @5 \
find . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'" v0 |: [  Y: U3 G1 C( H) o
使用sed操作批量替换( s# J  ~) h, T. p( t: f, g
  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
* Z' X7 `: a$ w! a  linux sed 批量替换多个文件中的字符串
3 t6 Y8 c: K; h" p# N2 z  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`* y$ s5 m* E" r" t
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com
0 t- R% r9 g4 A  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
$ G+ P* N; S  Y* |/ U5 U( H   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" *
3 ~/ j, S6 R& ?2 r& ~% I5 |" c
" d9 U/ L/ |& T6 v3 L1 X/ p参考: http://www.php318.com/show_137.html
3 n- `) H6 ?, S. P, k

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