$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 编辑 2 w! r, U* F) M9 Q; L- k

+ X9 h8 q+ x1 T2 m" @- actags: linux perl shell perl  vi grep awk xargs  批量替换$ b9 y7 O# j/ i1 O1 q" l

  n! ^- O0 T) M9 a3 m" c. Z, P- b- N0 y8 D& w8 C0 `8 M
方法1:
  m' N, X. j2 b' `  V) G1 M1 o
0 P0 f! g8 H9 q2 y这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库." X8 s1 h; t6 M+ k  ~- R
手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
1 R, R5 N2 _) r6 R: f% `find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
& r8 h" `' A+ B- s& K, A1 yfind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
" [) I$ d; R# B9 p( Y9 Z* Uperl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
/ h3 a! z& v- a- w3 ?从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
3 e2 ^+ w( g0 l
: L! P" M2 h; d( f" z7 m
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
( E9 J; p" E8 {  g6 ~ ) ]( Y6 N8 m5 K/ t9 @3 Q+ V
方法2:  v# Y5 o8 b! B9 M, {

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
2 K2 O1 P; h4 r) S6 F, Z' u: r用sed命令可以批量替换多个文件中的 字符串。 6 B3 V8 Q& E, t( w) x& G4 \3 w
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
$ B$ X5 p2 x. l1 r0 n例如:我要把mahuinan替换 为huinanma,执行命令: 9 C+ m9 V+ J! _% e' ~
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
  K) c  {/ o3 o1 ]- e' u这是目前linux最简单的批量替换字符串命令了!# `( B) a7 g: J5 @
具体格式如下:
7 Q. a2 ]4 M' x" e+ h4 Ssed -i "s/oldString/newString/g"  `grep oldString -rl /path`
6 s% m: G0 B7 q, M3 N8 i3 t) q实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`0 a0 I- B- j1 k& }7 S  V/ x9 z
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

在日程的开发过程中,可能大家会遇到将某个变量名修改 为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
% @; R5 ]0 H: m- Q/ ~4 o$ H9 N& _
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
# N3 E2 N* a% N. r
" }1 Q& W6 X+ E; v1 ?
from: http://blog.zol.com.cn/1395/article_1394052.html5 Q" Q/ Y( O7 n. Y* _/ X! L

  b7 V. ?& a! W补充说明
2 p* w( V5 f; @/ K
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`    # O( I( s; d% T7 o7 [) n3 m
对多个文件的处理可能不支持,需要用 xargs, 搞定。
6 t$ M& C  z) E变种如下:
8 ?' U3 \* Y2 N  A( B+ B* U8 O- Xgrep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
* q2 b+ s% |' Z' _4 U& Z0 Y5 h) x& }$ \( S. ^
注意
5 `& y; B: r8 ]$ N
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前') x. A5 q1 c9 y0 |
: f8 E8 u! y% k  t5 }  A: x% z5 p
它山之石:
0 N9 z6 k" H7 T1 {1 f3 W
3 G: `4 w$ \$ S: r3 E1:查找  n4 z' e, Z* M9 a& Y( Q
find . -type f -name "*.html"|xargs grep ‘yourstring’
: U9 Z; m* n9 I+ o# ]$ j3 j8 |2:查找并替换
0 y$ X3 }7 c5 wfind -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'3 \9 j! q8 d8 z5 u- a2 j) V; m8 I
perl -pi -e
6 u5 K( ]( F& @2 v在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.1 V$ K. f0 U9 @( C1 h% H5 N* K
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。$ Q/ C7 _$ ^  H3 f. E$ N+ _2 x3 O
3:批量修改文件夹权限
$ ]( I! p  U' Z0 @find . -type -d -name *.html|xargs chmod 7550 B+ h* w* {5 n1 _" [
4:批量修改文件权限
+ V3 H1 V9 _4 K2 ^/ Bfind . -type -f -name *.html|xargs chmod 644
. K( [# [5 v) m# f6 W. ]查找和替换是很常用的操作。+ L9 ^2 Z( S# F+ Q3 H; B
这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。' s" E/ C' z! i1 F) W
以例子进行说明) u9 ~9 G5 u0 x& @! Y" C
在当前目录下的.c文件中查找字符串"password"
+ I; H( H4 d, ?+ n; }grep "password" *.c4 X, x9 X- y& u: H
在当前目录及其多个子目录中查找文件test.c! ^  ]. Z4 S7 K8 q1 o
find . -name "test.c" -print: U1 J! j, U* d( ]4 l5 D
在当前目录及其多个子目录中查找.vbs文件并删除之8 _! ]" W' o& s1 j1 E( [
find . -name "*.vbs" -exec rm {} \;$ \. z8 Z& P& E. J+ W0 P
在当前目录及其多个子目录下的.c文件中查找字符串"password"
5 l( ^' ]  c9 F0 b) ?3 g: ofind . -name "*.c" -print | xargs grep "password"$ j6 p1 h6 ^, Q
在当前目录下的.c文件中把字符串"password"替换成"pwd"
% ], q6 H/ r5 O% x1 g" i( V0 aperl -pi -e 's/password/pwd/g' *.c
& A  E9 J$ H3 \# j在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份* F7 x* b0 P1 r: K4 m9 f
perl -pi.bak -e 's/password/pwd/g' *.c
& S6 r' ~2 G( k- P1 h2 ?在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"0 R$ H% [1 f& a6 J. u
find . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'( A6 b; s9 i' S, r: Y
使用sed操作批量替换
% h* V: {; C; c/ E" F' x" `  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
/ z/ L! w+ K& {: U3 t  linux sed 批量替换多个文件中的字符串
# Z! _2 I; j' ]  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
0 |  {) [4 Y' R" O8 E  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com8 f$ E3 Q, B+ z9 x' Y4 |
  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
" D4 X# h% B5 O( V6 J   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" * ) a$ N: o6 Y8 R! }/ Y, D1 y
! J; |; M. a9 R; z) g" X& W
参考: http://www.php318.com/show_137.html/ i* o; n! Q$ }% i, @6 C& M

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