$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 W+ _8 D  [& w1 b

" n# [8 b4 U7 N$ Q% H' Yctags: linux perl shell perl  vi grep awk xargs  批量替换8 H# }, @2 z' ^- R$ I5 T

$ L; K' `/ M9 [2 k  {" }. B+ N& r
& \7 Q; M% a7 F9 x# k" d) Y
方法1:, D1 ?% s3 V, H4 _

7 l3 ~5 B; b4 ~/ Y9 k这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.0 l9 P+ R3 j+ n
手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:+ N4 V1 C* i/ X. J6 a) |; A
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
7 U& I$ a2 e7 H9 ~find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,. A6 s) t$ y. ^; `7 s; r5 l
perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
. j; q  ]. _. n" a5 C从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。! F/ G7 P* E, R' {2 i

! H3 w' c) d) ]* n) ofind -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
% N3 e. H3 Q, O  g$ g/ s
/ r5 ?2 U# b; L5 l9 @5 y3 ~1 x8 f方法2:
, w) I$ M7 z( ?7 ~

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
! a8 D( x7 h$ f/ @( j用sed命令可以批量替换多个文件中的 字符串。 / k# k9 t7 b/ p0 T
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`  S* _; n3 @. J% ^, [
例如:我要把mahuinan替换 为huinanma,执行命令:
8 Y6 \) f. |+ \& f& I2 Dsed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
4 X5 C7 l7 X7 ?这是目前linux最简单的批量替换字符串命令了!
# q. E( |$ ~1 @  t具体格式如下:
2 w" R  `% \: B* {$ c% Lsed -i "s/oldString/newString/g"  `grep oldString -rl /path`2 ^5 A) i$ h3 M1 q1 }: S! r
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`9 U; h9 E/ n2 x  c
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`

方法3:

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

. s+ P6 Z2 R  s9 C( R1 H6 y" z
from: http://blog.zol.com.cn/1395/article_1394052.html
* w/ Q, B- R6 x5 _) Q) U7 \0 v
3 r( c- H/ j" ?' m! @; |. D补充说明3 ~, e1 p1 Q3 m. s0 t# M
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`   
4 i3 T7 g$ i4 K对多个文件的处理可能不支持,需要用 xargs, 搞定。
, A$ Q  J) j9 i( F3 D变种如下:1 b8 U0 e3 ~5 W" }. V+ P
grep
oldString -rl /path | xargs sed -i "s/oldString/newString/g"
) v' x1 T8 O) p, ~& z% Q
+ T& P+ l& `6 r: ?- D4 S+ Q2 e  [注意
. k( W& [$ ~1 G6 Q& z
在  `grep oldString -rl /path`    `1前边的翻引号`,而不是enter 前'
2 y7 |# u& k  ]# E8 W% a6 f
2 [1 B5 D* r! m' k它山之石:+ @% U$ M( k8 ^0 ~* y* D
  v% W) D& }9 e" ]
1:查找
* s7 r/ T# R8 ]! C& Q+ {: Yfind . -type f -name "*.html"|xargs grep ‘yourstring’2 }4 N4 g2 c8 s9 g% K: b3 r
2:查找并替换
! G& Y' s3 q- d9 X* y2 s# ?- ~find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'  t! }" A. F0 U4 V5 I1 V, C* X- r  y
perl -pi -e0 d& v# i: ~  n: p7 T& h) \2 w
在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
9 z; B& w$ ^9 D' M2 u, t2 ]0 C从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
/ b* V% Z1 K1 u( w5 u/ [3:批量修改文件夹权限: m! e0 ?' V- V1 v& x5 k
find . -type -d -name *.html|xargs chmod 755
4 X' N5 p8 ~# R8 T4:批量修改文件权限
4 _# Y1 b8 R4 j# W1 o8 \find . -type -f -name *.html|xargs chmod 644; x; a/ `2 E$ _+ a+ \0 P
查找和替换是很常用的操作。- i* x9 w$ [* y% H7 S% p1 u: [
这里介绍的小小技巧可以使你很轻松地完成大量重复、繁琐的工作。
7 ?1 ]! K: R! D. [/ j3 {以例子进行说明
5 g/ \3 q6 l2 v9 ]! I1 k在当前目录下的.c文件中查找字符串"password"
: W$ ~$ Z& S. ]2 f/ ^7 m# A. Qgrep "password" *.c
2 j- [! k, I+ L9 C/ }2 U& m在当前目录及其多个子目录中查找文件test.c  o0 K, e7 O, G. h/ O, c
find . -name "test.c" -print
' j6 C7 x7 J( G8 t5 P" E2 G  A4 _在当前目录及其多个子目录中查找.vbs文件并删除之' P6 {/ b7 c* O2 T4 h
find . -name "*.vbs" -exec rm {} \;
2 U6 }0 m  e( |  t8 h* A+ a  q在当前目录及其多个子目录下的.c文件中查找字符串"password"7 H$ [% p: y3 d1 S: |3 e
find . -name "*.c" -print | xargs grep "password"
3 s2 E" p- G& G, c在当前目录下的.c文件中把字符串"password"替换成"pwd". w( W# I) B2 ~9 z( ^
perl -pi -e 's/password/pwd/g' *.c8 O/ z' ^9 J/ \2 J- p! ~  ]7 C
在当前目录下的.c文件中把字符串"password"替换成"pwd"并以.bak扩展名备份
% Z& M9 M" N9 g% k- X3 [- `; \" Aperl -pi.bak -e 's/password/pwd/g' *.c# {" Q! P$ A  }/ j: J9 ]! A
在当前目录及子目录下的.c文件中替换字符串"password"为"pwd"  y, x, {) r% Z: b8 c. f
find . -name "*.c" -print | xargs perl -pi -e 's/password/pwd/g'
5 |' `/ |9 x) P- Z" @& K使用sed操作批量替换
  E, {# A5 I3 |: H; A  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`4 r3 h7 E4 {6 s2 s4 |
  linux sed 批量替换多个文件中的字符串
' `2 F4 N. E) T+ E9 w9 {- r6 y3 q4 C. v  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`! m; G1 ]" A" Y- |/ U1 `2 ^* Z
  例如:替换/home下所有文件中的www.1kkg.com为www.fjbjdd.com0 E7 W! Y8 ^, l7 E& B5 Y' F" u
  sed -i "s/www.1kkg.com/www.fjbjdd.com/g" `grep www.1kkg.com -rl /mysites
- h" E2 Y+ a/ B; A! K5 o   在当前目录下操作:sed -i "s/www.1kkg.com/www.fjbjdd.com/g" * 0 P7 r; h: E' X. c: `5 b

" t$ i. N, ]8 G( q3 E参考: http://www.php318.com/show_137.html
0 `' F" F; F9 H

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