$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 编辑 6 ^) t- }" g. `5 m$ F# H5 Z7 y$ j

$ R: W4 p* o2 l6 k. }6 {ctags: linux perl shell perl  vi grep awk xargs  批量替换6 Y+ D5 m- Z6 W: f% y: ]) N+ C

2 n+ I/ Z! B! y/ B; e1 W& A! h, l1 k
. f# h) \% x7 B( x
方法1:
, p- K9 V* \! o) Q  ~$ v' h
& o. V5 g( t' u( s/ _3 p2 {这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
) k0 o3 G& m# @手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:0 ]+ g0 `" M$ |* ^$ A! E
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
3 u# ~% y1 ]7 r4 O! c  M/ W3 h: afind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,2 M# f  y  x; {5 y& f: l# ~
perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.. P" F: U: P& F( h/ T
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
, q* D! U( o6 w% }- m

" j- {* J6 H+ h) J. T. N. q& yfind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'% u: @, g+ @  K2 `: Z1 w

/ N) q( A* X! O/ L# b9 z方法2:" w5 b9 q0 k$ n: O  o1 C: i+ A

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。( e( @- A# ]. ~. Q9 j1 d$ x" _
用sed命令可以批量替换多个文件中的 字符串。
5 S# u, |9 P6 ^2 lsed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`# i3 w& U( d8 E: [/ |$ V
例如:我要把mahuinan替换 为huinanma,执行命令:
4 X* u. G: J8 @0 K. X  Msed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
4 A! }# f+ p( X( V这是目前linux最简单的批量替换字符串命令了!
4 P8 ^. ~  m- ]5 V$ I具体格式如下:
3 [6 T* D/ I3 jsed -i "s/oldString/newString/g"  `grep oldString -rl /path`. k. R7 j' j/ m/ U. M7 Z' f
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`  G* C7 e3 q. Z
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

在日程的开发过程中,可能大家会遇到将某个变量名修改 为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:3 y4 Z" {$ t, q$ x0 x
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
* F( B7 m  }  Z5 A" r2 r. S
4 b# `; }9 P% r7 @% S! K6 U6 G( {
from: http://blog.zol.com.cn/1395/article_1394052.html
2 u; `: V* y* Z- w
! `: V- b2 g# g6 g. p# p: O$ e补充说明( [" {( O/ E3 l/ T
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`      j/ u0 t- ?2 h* i6 }8 M$ q. s/ f
对多个文件的处理可能不支持,需要用 xargs, 搞定。
$ U9 ]4 }/ l( F3 e6 R变种如下:
: {1 h7 g3 I( l2 C" S3 Mgrep
oldString -rl /path | xargs sed -i "s/oldString/newString/g" % u8 _, j  L" ~+ U- R2 Q+ J/ V

  f5 u+ F; ?; O7 g' h& ?+ C注意) ]5 v2 T4 P  |8 Z. K
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'+ }  n. ]; e' c* w
$ @7 m; O6 t( @' ?* ~7 g0 k
它山之石:3 v) f& U3 k. t& D
2 x3 m: Q2 Y- `1 s; q9 H
1:查找& o3 s7 Z: Q0 a9 Z9 a
find . -type f -name "*.html"|xargs grep ‘yourstring’
3 B- e2 q8 j7 ]4 E7 D) j2:查找并替换
3 F* Y. S: \/ O' r3 ]. k5 V2 C1 jfind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'% |9 J0 j$ e3 N1 [8 X
perl -pi -e
* I- z9 p: V, q! P3 s在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.0 _0 T* h7 f9 ~: E* f! @. z
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。+ Z* T5 H; W& m5 _. g6 D! @
3:批量修改文件夹权限
6 g8 _* U  [* z% }find . -type -d -name *.html|xargs chmod 755
+ M& n4 r1 Q: d9 w, K* v. e1 r, N4:批量修改文件权限
7 }$ b1 o; ?! N8 {/ C9 P. Nfind . -type -f -name *.html|xargs chmod 644& ^8 e! Q) t# N1 \2 y. @; g
查找和替换是很常用的操作。6 Y& V% h6 M/ {' V# Y
这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。1 s  e# D3 ]/ D$ ?
以例子进行说明
0 i  ?7 c- P1 g* ?+ p; N在当前目录下的.c文件中查找字符串"password"
& I. E6 ?" l4 P' C5 e+ ygrep "password" *.c
6 u/ _; K! p7 \: ^% h在当前目录及其多个子目录中查找文件test.c) R* P4 [* R7 T2 Z3 s) p  f: Z
find . -name "test.c" -print) o- T* x1 l7 I
在当前目录及其多个子目录中查找.vbs文件并删除之
  x+ L' u9 s5 b# U7 X& Zfind . -name "*.vbs" -exec rm {} \;, q! X1 [+ \# v3 @2 |
在当前目录及其多个子目录下的.c文件中查找字符串"password"7 k5 C/ Q- A0 k4 ?* G/ ^
find . -name "*.c" -print | xargs grep "password"( ^) J( M/ ]7 A4 f! U" U! z$ F2 I
在当前目录下的.c文件中把字符串"password"替换成"pwd"# z8 k6 q. L: U( f9 O
perl -pi -e 's/password/pwd/g' *.c0 e$ i4 I: {8 M, A  |, |1 u* _
在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份
+ D' M5 d0 t8 d$ }. F' Jperl -pi.bak -e 's/password/pwd/g' *.c
9 ~( V( ^0 z" g0 L  n, N, c在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
+ {$ m  u+ z0 q- v2 j  A: sfind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'
- V8 v) |$ Z' ?% K* [8 y使用sed操作批量替换. Z# L) Z( a0 ^
  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`# E, G& P; i9 C& a8 ?
  linux sed 批量替换多个文件中的字符串
( x/ r+ I  [1 K+ ~8 [, v  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`: ^0 Z8 n5 t( q. @; ~
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com
5 h3 x' t7 ?. Y- s/ h  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
5 P2 y& B- E! S* F* R! E$ E5 P& l   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" * 7 {* f1 G1 M7 n( n  m5 l% e
$ l$ N3 ]; O) _' \
参考: http://www.php318.com/show_137.html9 G# B0 D  w0 @

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

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