$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 b  ?3 {5 d0 ?8 d
! f" L6 H, c+ E
ctags: linux perl shell perl  vi grep awk xargs  批量替换% P, C  e$ }  F

# c3 k+ x7 j" k! ]7 i
0 R- B% C6 ^7 i6 `
方法1:8 v5 T7 p! Z9 ?1 A4 K, g, G

7 `6 M# b$ X8 c; _+ r; f这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
# |5 X9 }) M% i& z7 Y手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
# W) H! x7 t0 C: V, K  vfind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
. S9 @! w( }1 ]" T; V! K  O! c0 ?! i. t1 ufind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
9 ~# L5 a# p6 Z* ~, r7 T2 \, ]perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.! i) E- M% S( g
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
: ?2 `( n( M6 j8 c

7 G  p7 u) ^4 @& j. vfind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'4 ^' Y8 t! i5 `# J) q2 X9 e; w

, |5 U5 t+ u$ o. l方法2:" ]- z7 ]4 @# C' c$ ^

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。* u/ U' {# }' C7 o$ w. g: x4 K
用sed命令可以批量替换多个文件中的 字符串。 % V8 n  w- |; m, ~( J
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
6 t: A& v$ J. E4 T4 Y例如:我要把mahuinan替换 为huinanma,执行命令: ' v" F; v. q' D4 L  j
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
3 q: u% v& ~; m这是目前linux最简单的批量替换字符串命令了!( f2 {. ]5 j& E- d1 y$ i
具体格式如下: & f5 s& Z8 Z! Q: Z
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`: X' y' e* ^* G2 \
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`/ }- ^: [: M* B$ Y. n. A
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

在日程的开发过程中,可能大家会遇到将某个变量名修改 为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
0 ~* |9 B; O  h/ ?! \, {# R& m4 a
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
) g1 K" T% @6 ^9 v2 ]

% g+ V4 j2 H! [4 B& kfrom: http://blog.zol.com.cn/1395/article_1394052.html
% M8 p8 ]) |, k2 l# E3 ?7 |' x8 E  y+ _4 P
补充说明
, k/ [3 `3 c# m3 l0 k* S$ ~
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`    ' a8 X! U8 ]: ]7 l( k; b' W
对多个文件的处理可能不支持,需要用 xargs, 搞定。
. J, X0 S1 k+ r: @7 N5 R变种如下:
) }' {" W& l- j& jgrep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
" L5 Z$ k3 @  u2 S
- o# \$ w4 j7 z5 j8 x注意1 V2 |# z5 [. m$ h6 _$ F4 `( ^6 p
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'
3 ]: O8 S1 _! I3 W1 c2 s4 d. g9 l$ M2 S5 d, ]; g9 ?4 b
它山之石:* |5 t8 L& |! Y/ \0 R/ m

/ i: _4 X# b  N9 Q1:查找
( {* Q) d' A4 {2 r) G, Wfind . -type f -name "*.html"|xargs grep ‘yourstring’# ?; c1 u5 u  c5 ~; j% V
2:查找并替换; K: @& ^- Y* V3 \; U+ T
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
  y4 D5 ^# s2 x7 t! N- vperl -pi -e5 b  d0 d8 ^' t, n8 e. Y- o+ F
在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
7 _8 [1 L( u; g& l/ d* l从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。3 K" H; X8 w5 m( O' ^  ]! L
3:批量修改文件夹权限
1 W/ i. A, m2 ~9 [& |, efind . -type -d -name *.html|xargs chmod 755# `5 ]* s% b4 f# v4 u: K. }2 w
4:批量修改文件权限, k. w, n0 V" |0 _
find . -type -f -name *.html|xargs chmod 644
/ N7 z/ c# E' V, S. ?& A查找和替换是很常用的操作。
5 _! @1 O$ M& Y6 l这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。
; ^1 [$ x$ v) L7 ~7 l: S) v7 `9 D以例子进行说明, v" U- l* ]+ @3 r$ R3 I: m  c" ~
在当前目录下的.c文件中查找字符串"password"
, p2 H) d" k+ A9 G* ogrep "password" *.c
0 Z! |3 e" B8 ]) f6 M" Z* h在当前目录及其多个子目录中查找文件test.c! E3 J9 }4 ~0 \2 w& u
find . -name "test.c" -print# Q- H6 T0 z6 U9 t( b. n2 m8 X( H
在当前目录及其多个子目录中查找.vbs文件并删除之/ O1 y* M& }0 k' t- N( A: k
find . -name "*.vbs" -exec rm {} \;% Z& z7 F. L% W7 t2 U& j* W
在当前目录及其多个子目录下的.c文件中查找字符串"password"# t+ I; w% t; K/ t, o. E/ [
find . -name "*.c" -print | xargs grep "password"
& f( f/ L0 T( K' r在当前目录下的.c文件中把字符串"password"替换成"pwd"' j! B; ^& L. v7 S# w# N/ N) s5 A
perl -pi -e 's/password/pwd/g' *.c: F! g  G) L# r6 f
在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份9 B( l9 L$ o8 A4 F$ @* s
perl -pi.bak -e 's/password/pwd/g' *.c
) \7 ?/ \, I9 |8 f* c在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
* Y7 S/ w; a3 i: q6 S, Ffind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'
2 q& H1 I) `. C使用sed操作批量替换
6 T1 R# C5 N5 d# o  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
/ k( p$ N1 o: `- c% N* {% [  linux sed 批量替换多个文件中的字符串
* A! O2 F$ e6 b8 \! b* m6 W/ e4 `' ~  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`! m) I: D/ t+ U/ G0 H! U
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com; {) D* L# t1 S
  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites+ ^. ^8 n: |# q$ V. `- U8 X
   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" * . n% g0 Z" _. ~1 X& m1 G
; H9 p% d4 L, }. {. H7 {" g
参考: http://www.php318.com/show_137.html5 K$ \3 {, i/ V( A6 |

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

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