$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 编辑
9 q' ?( w  Y- U: z5 ^% z6 K! z( y$ c8 i5 o
ctags: linux perl shell perl  vi grep awk xargs  批量替换" _6 C) D" T3 `. C7 W# \
. f. j* I( g$ j; |6 f: R% T  y
& o* U" z% l/ r
方法1:
. {9 s2 m' e- Y9 ?: l4 ]. `3 @
/ Z( Z0 L" V+ Y4 x% A* ^这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.6 a; N+ g" Z& f2 N5 H4 r
手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
5 f6 N1 _8 \3 w8 J1 ?find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
0 L' R; M) L) E: s% S% i2 Afind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
3 U7 B7 }3 H* k% `  N1 R  ?perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
0 g+ u( l4 ]  l" b/ _* ]从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。2 o- n5 d6 N5 x
4 o9 f7 p; D  |! f) Y7 s
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'7 \$ X5 q; C6 M/ E5 u
8 J: F2 o- T% x9 e8 T+ k
方法2:
1 B& y: l6 @0 v' ]

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。- Y' N: L0 y+ O: j4 O
用sed命令可以批量替换多个文件中的 字符串。 " b) V0 L( P, G2 v4 M
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`8 p5 l0 @, r7 y. {: G( S5 ~* u
例如:我要把mahuinan替换 为huinanma,执行命令: % f, ~, K# f# ~% J) C  W+ ~
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
& W8 z" C  a2 L: ^! L6 p* G这是目前linux最简单的批量替换字符串命令了!
( q, h' X  y3 G具体格式如下: 3 q- S8 a& _+ }3 {( |4 A
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`/ `2 z. F/ P, r5 F# d/ l
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`+ g3 e3 h. Z5 t) X- Z: u
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

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

+ r! t- n7 b6 z) u+ ?
, t. s5 ~" h- Y0 s8 jfrom: http://blog.zol.com.cn/1395/article_1394052.html
! M- B( e9 Q8 H1 @( {" j- W1 h5 n- x- W
补充说明
) v. i/ y0 Z8 ^/ V2 `6 K1 O
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`   
% f, u9 F' E( }$ b* v对多个文件的处理可能不支持,需要用 xargs, 搞定。
: W4 n, y6 P3 a- h. J变种如下:
. B! Y0 W4 {- @, T+ D3 e" U% z0 q+ ugrep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
; H! l" X5 ^) y3 H1 c/ n' d1 ~6 e9 p! K  O, `
注意7 \" ~, [8 r; ]$ G7 i
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'  m2 ]- i' y9 _9 X' k5 `
; \+ T& ~5 P% n& t$ b9 C9 L
它山之石:  L. E- I8 T4 k
6 o# b& z& p9 ^5 ~; \; e
1:查找
9 s' {0 \( j" u) m/ p# }9 |0 ffind . -type f -name "*.html"|xargs grep ‘yourstring’7 L4 ]7 w# J7 {$ K" N$ c/ r7 e
2:查找并替换
9 e6 ?9 t4 d- F! Y% t$ Qfind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'4 v6 G9 t9 [& _4 q( m
perl -pi -e
" C" k5 N$ {6 I  o在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.. D& O8 [* T! B/ H* F& V$ x
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
2 _6 E7 G% ]7 E3:批量修改文件夹权限  @9 c* T/ u9 h- ^1 N/ Q
find . -type -d -name *.html|xargs chmod 7554 y. O4 @3 I. E! w8 c/ r9 P
4:批量修改文件权限9 j8 X6 {7 T6 k/ s! Z1 i2 g
find . -type -f -name *.html|xargs chmod 644, K0 G, c, K, W8 ~5 Q
查找和替换是很常用的操作。* |% L: o; C/ y2 F" j
这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。
, K0 {1 d' D4 ]& y* g8 R, N以例子进行说明
' e2 X  N" {2 v- F& b  S% t$ ]+ y在当前目录下的.c文件中查找字符串"password"& K; R' p2 s+ C
grep "password" *.c
  B. ]0 N- Y. v, K* }! Q在当前目录及其多个子目录中查找文件test.c: F8 w0 f2 u; E# S- s8 w8 n4 Y9 [+ P! c9 E
find . -name "test.c" -print
7 w- ]# d7 ]# }& x' g在当前目录及其多个子目录中查找.vbs文件并删除之
5 \9 g4 `% z7 Z$ lfind . -name "*.vbs" -exec rm {} \;2 x% r  P" |: a/ \0 ]* w5 F( L
在当前目录及其多个子目录下的.c文件中查找字符串"password"
! @0 `3 k: ~, R) Hfind . -name "*.c" -print | xargs grep "password"
5 K; h% H2 M" _# r  u8 H在当前目录下的.c文件中把字符串"password"替换成"pwd"
& z2 t% z; S2 h6 nperl -pi -e 's/password/pwd/g' *.c8 S8 ~$ E% e3 E2 X$ y3 h! a4 t
在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份0 h7 Z+ r, E8 {' I$ [
perl -pi.bak -e 's/password/pwd/g' *.c
4 l$ z$ w! @$ v; _. h在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
- C: v' e3 ?5 Z) i' d8 V& G+ Gfind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'- U# l& A, N: d) f
使用sed操作批量替换
  A! a5 _6 n% A6 W7 ~9 R  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`/ V1 J4 Q8 W6 U
  linux sed 批量替换多个文件中的字符串) r8 C: K# L  Q8 N8 _* l1 s
  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`; P6 Q# M' q/ B; Z' ?
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com
) A3 A4 ~* Q7 ^  {) W5 ?  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
) I: Y% c; q- }7 p: w2 H2 }   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" *
( V' y- S9 ~2 G, q6 G: X/ W
2 D3 a; c7 v" {0 h9 [8 M参考: http://www.php318.com/show_137.html
7 E1 m  Y1 r* x* r2 |% W( N

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

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