$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 编辑
- _: r1 [/ u; o- }8 c3 J
/ X/ H; _1 B" octags: linux perl shell perl  vi grep awk xargs  批量替换
1 x* O" E" o3 t% M7 L& h6 G/ Z; X  J) U0 k7 @) j& y

" Z$ T+ H8 w7 e  \& a- e
方法1:0 J! E% ~% \0 }3 r, l# D
* S  n/ t9 v8 e% G) V# D  y
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
0 E7 C; A& d, z7 y! `7 s手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:9 s- F! `5 l7 ?1 e+ w' j
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.+ F5 Y1 t* V& P6 D/ H  N
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
3 Y6 M2 c. b9 M" R' Wperl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
8 ]0 v+ |+ Q/ K4 R0 u1 @从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
& A9 M2 C# F% f5 J

1 [4 O0 l9 T" L! x* _4 g; O, y& W5 bfind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'" t) R  z- r/ R" z) T/ y

2 A! k3 ~$ V* U/ A方法2:! V1 k+ i' B" x! F7 b$ H- H

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
. Y% @" W$ W( ?+ d用sed命令可以批量替换多个文件中的 字符串。 6 {+ X$ d* b; d9 J# f% t8 W& z" f
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`* q3 ^- @3 f& T7 b4 o' k9 ]
例如:我要把mahuinan替换 为huinanma,执行命令: 7 L. o/ u7 A9 D7 X  u# u
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
' d( y; L5 [$ p, e0 z这是目前linux最简单的批量替换字符串命令了!
3 h/ r& n/ k5 X具体格式如下:
: Y  f" h; }- J' t6 ~' d* psed -i "s/oldString/newString/g"  `grep oldString -rl /path`0 C4 X! u. C1 i' I5 G4 J
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`
+ ?+ H) m) `! C9 Z+ G* t
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

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

( W; H; X( E8 Z$ H/ C( Mfrom: http://blog.zol.com.cn/1395/article_1394052.html! ^6 p, S, ]& F' Y

& m' `1 t7 d$ M9 e; x补充说明
$ o( H; a- v; q+ w3 n
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`   
5 x' x5 J8 r+ _+ r- T对多个文件的处理可能不支持,需要用 xargs, 搞定。/ M# O0 Q, o+ ~0 ?+ z3 p  ^
变种如下:' h& N/ R1 p# c0 q
grep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
( D" X4 a: H; ^& g- u& S+ q3 A6 G8 r
注意% J) L2 v2 a/ y& i
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'0 x/ q7 V- H: c
; g# a- m  ?- M3 G
它山之石:! D7 y) _  q3 N( h/ B2 c
& ^) s& L0 A4 B0 u
1:查找
- S5 z$ n; [2 Ufind . -type f -name "*.html"|xargs grep ‘yourstring’
  B- S9 d0 a' S6 t" f5 ], j8 j2:查找并替换/ ~& l  K% B4 d4 \6 K+ U; O1 y
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
, G6 B2 g& H% cperl -pi -e' Y. @3 j3 A/ v1 j
在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.* _7 W3 p# v6 V' ?2 Y5 T, `- s
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
, J. }. O- {( }3 A) `! {3 o3:批量修改文件夹权限
. {& u8 k3 @6 E5 d0 l: a4 s/ @find . -type -d -name *.html|xargs chmod 755
& c# q. @5 q4 b8 T4:批量修改文件权限- e+ z7 d% p: ]3 R
find . -type -f -name *.html|xargs chmod 644& Q5 N/ \; v: p( o( }
查找和替换是很常用的操作。
  S( c7 F4 x, ^# w这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。
( z- r4 t% V9 n( O/ C4 i, \  b以例子进行说明( j* y7 E6 ]  ]0 l& w5 H# E) H/ }* h
在当前目录下的.c文件中查找字符串"password"
9 \3 @6 N) t0 Ugrep "password" *.c
3 S7 d6 w0 T, m在当前目录及其多个子目录中查找文件test.c  F" f. w& S- @( }: G
find . -name "test.c" -print
8 A9 O6 y8 m7 F1 x在当前目录及其多个子目录中查找.vbs文件并删除之$ Z: A, H7 Y0 {3 o
find . -name "*.vbs" -exec rm {} \;; r6 i3 D! x5 f
在当前目录及其多个子目录下的.c文件中查找字符串"password"
: v) M+ q/ L' n3 v5 Bfind . -name "*.c" -print | xargs grep "password") ^% B1 q. k1 k' d
在当前目录下的.c文件中把字符串"password"替换成"pwd"  n1 ^; L- y) O  U$ E& {; O
perl -pi -e 's/password/pwd/g' *.c
! A0 t6 |6 |. I: T在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份
( T: ]8 n% l, T, O( C& Pperl -pi.bak -e 's/password/pwd/g' *.c
6 m( i- [9 }& g. o在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
& z; {& _! g2 U4 a5 ~( l  lfind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'6 ?, T6 S$ ]* y, u' s# U
使用sed操作批量替换0 g2 L* s8 |9 L% ]2 ?; ?' B
  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
* F& G# P( |" p  linux sed 批量替换多个文件中的字符串
# `  G! w6 I0 U7 ?7 ]8 |! I  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`0 t& S2 E: A. P0 l
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com$ O8 m5 P. k8 t+ m
  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
, u4 G2 h6 i2 s5 Y   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" * & C9 @& m' D8 N" Y% _: }
  U8 _3 P# m% h. p
参考: http://www.php318.com/show_137.html
; I% O& o- D) }, L) A0 Y/ L+ j

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