$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 编辑
3 d( P4 }' U5 ~$ L! Z% B2 A5 m% a% g. ~+ S+ t
ctags: linux perl shell perl  vi grep awk xargs  批量替换6 O# o2 Z0 C+ L

, T/ }/ Z7 V1 j8 Q  Q/ v: Z
8 J; f$ z7 V9 m; r6 I  _
方法1:
" K: S/ o6 `8 P: T  X
- s, N2 k: [5 A( W. V, `这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.) p" i& _5 G$ y" H# W
手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
% J* v) I6 X$ }" Efind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.& c3 n4 g& r. r) B2 J0 z2 g) H
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
  T, W6 A2 d: z( D" E+ Z& D& gperl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.& V# n/ \# u* v7 Q+ J5 |
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。/ V0 Q5 M4 x# L8 \7 N* W) r

4 {! {5 w, Y, y8 r( Mfind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'( ^7 B* O% A$ m) v7 {

  h; n3 `: [" o/ T方法2:
: N: W/ o2 P4 _2 m$ L

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。, R1 }$ K2 n' t- \# H
用sed命令可以批量替换多个文件中的 字符串。 . R8 L% W. q! [8 O8 m2 w, l
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
4 i0 [# _! F5 W; c- f$ {例如:我要把mahuinan替换 为huinanma,执行命令:
" ?) Y  p& `! u( bsed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'6 l8 @3 u$ W* b9 o/ }* L
这是目前linux最简单的批量替换字符串命令了!7 \2 M9 E. R+ y! {, a
具体格式如下: 6 ~/ R" D! g' [+ o
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`
! g( j* j6 F! g+ b# G+ t, k实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`# ]1 S; z' r& O9 h
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

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

0 s" |' n6 U1 e# s8 A: ^
4 U% S5 Z3 t/ ?/ Pfrom: http://blog.zol.com.cn/1395/article_1394052.html' V3 U- E# F4 i+ Y6 P7 C' w6 _

7 L* B; ?* w5 p" J6 c补充说明2 E/ B. z, c) m+ v! h' a
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`    ( ]% \- r8 ]9 |
对多个文件的处理可能不支持,需要用 xargs, 搞定。
! d4 o: g4 g) c$ Q变种如下:4 |$ ?0 h: ~: ~: v, b
grep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
. P6 R# y/ b* c- w0 Z! m1 Q1 }6 ^2 Y/ u! w. e+ C* s: w
注意4 W" _- f2 d/ G  _: h& ]
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'
; F' Q3 o+ S8 n: D" V
1 C6 O5 s+ {$ ^( n2 K1 u8 `它山之石:
; P2 s5 f  s+ q3 N" ~/ ?! I6 k( Q6 h: u; W% c/ p
1:查找4 Z# m2 V1 H1 H, l  H) l$ [
find . -type f -name "*.html"|xargs grep ‘yourstring’
1 V0 _: f& R+ D6 A! x" T# b2:查找并替换+ r7 [3 S9 O! K& E6 w$ K3 _
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
/ I$ A, v5 P4 Z/ Rperl -pi -e
+ I& Y& {+ I( j. \在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
7 o: J9 X/ D3 p从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。2 Q! K5 }6 z% B7 h7 ^
3:批量修改文件夹权限
' P$ L. {( C( q6 F+ f/ d& L+ B1 @find . -type -d -name *.html|xargs chmod 755! E: U3 m9 J* q# A
4:批量修改文件权限, k( U1 |# j) n; |0 p  m1 O
find . -type -f -name *.html|xargs chmod 644
. c! l6 z) B3 I! B0 l  P查找和替换是很常用的操作。
* e* e2 \; ]- E. U这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。
& D" W' L9 b" E以例子进行说明; F" \& i9 G8 |5 S4 D; z5 f
在当前目录下的.c文件中查找字符串"password"
6 e  P7 Y7 L8 v2 L$ }grep "password" *.c1 o- e3 p7 j& j- |* u
在当前目录及其多个子目录中查找文件test.c$ D2 u5 u$ v* A2 b9 u7 t$ s8 Z
find . -name "test.c" -print# v2 Q/ o# _/ i0 \
在当前目录及其多个子目录中查找.vbs文件并删除之7 s" M8 G+ n* p$ n5 z) y" _/ K
find . -name "*.vbs" -exec rm {} \;
0 }8 x$ o! c4 N0 ]在当前目录及其多个子目录下的.c文件中查找字符串"password"
& w$ Z  j4 K7 a/ O$ xfind . -name "*.c" -print | xargs grep "password"
. j1 P# X; Q/ g2 T+ M: B; y在当前目录下的.c文件中把字符串"password"替换成"pwd"0 ?$ N5 U3 L* d' _2 X* ^1 c' r
perl -pi -e 's/password/pwd/g' *.c
( U2 f( M* n( q; e2 @- i% [在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份
" b- X+ I! i' s! X$ Wperl -pi.bak -e 's/password/pwd/g' *.c& n( {* N0 Y) C5 l% t& s
在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"
! N% F! M! R! l6 Ufind . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'! l* n9 O& o: S: \+ J3 J  J
使用sed操作批量替换; Q6 a- b, P5 `, R5 a7 g1 y! Q
  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`; k+ o4 H  i6 k. A  ^& w, `- c
  linux sed 批量替换多个文件中的字符串  ^, b5 r( [0 W: Z
  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`1 n) A; v9 O$ V
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com
3 P; `% b# U. X- h( _" ^! i4 m9 D0 i  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
( f% n' j6 z0 b; y; q9 x   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" *
0 d0 e; w) h$ b% y
* _+ w& F( x  S( O参考: http://www.php318.com/show_137.html
0 I4 q2 @, C3 N0 T8 e

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