Chinaunix

标题: unix 下面进行批处理操作替换某句话的命令 [打印本页]

作者: nimoncoffee    时间: 2005-11-21 17:19
标题: unix 下面进行批处理操作替换某句话的命令
请问高手:我现在需要对整个文档(cellularfactory)下面所有的jsp文件进行批处理操作,每个jsp文件里面都有一句花(如abcd abcd),我现在要把这句话替换为(如aaaa ssss)请问这个在VI里面的批处理命令该如何写?谢谢!
作者: 河里的鱼    时间: 2005-11-21 17:22
:%s/串/串/g
作者: nimoncoffee    时间: 2005-11-21 17:34
:%s/串/串/g
这个方法只是对具体的某一个jsp文件进行替换
我现在需要的是对上千个jsp文件进行一次性的替换,请再次赐教,谢谢!
作者: q1208c    时间: 2005-11-21 17:43
原帖由 nimoncoffee 于 2005-11-21 17:34 发表
:%s/串/串/g
这个方法只是对具体的某一个jsp文件进行替换
我现在需要的是对上千个jsp文件进行一次性的替换,请再次赐教,谢谢!


这个得用 sed 了. 因为要处理在两行或多行的情况, 写起来有点麻烦.
作者: cuci    时间: 2005-11-21 17:43
标题: 回复 3楼 nimoncoffee 的帖子
先find出所有的jsp文件列表,用for循环,循环体内改文件。
作者: nimoncoffee    时间: 2005-11-21 17:52
原帖由 q1208c 于 2005-11-21 17:43 发表


这个得用 sed 了. 因为要处理在两行或多行的情况, 写起来有点麻烦.


我要替换的只是很短的一句话,如把:abcdefg.com替换为aaaaaaa.co.uk
如果用sed,请问如何来写?Thanks!
作者: q1208c    时间: 2005-11-21 18:00
原帖由 nimoncoffee 于 2005-11-21 17:52 发表


我要替换的只是很短的一句话,如把:abcdefg.com替换为aaaaaaa.co.uk
如果用sed,请问如何来写?Thanks!


sed s/abc/def/g filename > newfilename
作者: bingosek    时间: 2005-11-21 18:03
原帖由 nimoncoffee 于 2005-11-21 17:52 发表


我要替换的只是很短的一句话,如把:abcdefg.com替换为aaaaaaa.co.uk
如果用sed,请问如何来写?Thanks!

sed 's/abcdefg.com/aaaaaaa.co.uk/' filename
会把整个文件的abcdefg.com替换为aaaaaaa.co.uk
就象上面说的那样,用一个for遍历文件
作者: q1208c    时间: 2005-11-21 18:05
原帖由 bingosek 于 2005-11-21 18:03 发表

sed 's/abcdefg.com/aaaaaaa.co.uk/' filename
会把整个文件的abcdefg.com替换为aaaaaaa.co.uk
就象上面说的那样,用一个for遍历文件


这样好象不行吧? 因为原文件没变的. 总要生成新的文件才行. 然后再改回原文件名的.

当然, 我写得还有一个问题, 就是如果这个词被分开两行就不行了. 这个要分开处理一下, 要多很多步的.
作者: bingosek    时间: 2005-11-21 18:13
原帖由 q1208c 于 2005-11-21 18:05 发表


这样好象不行吧? 因为原文件没变的. 总要生成新的文件才行. 然后再改回原文件名的.

当然, 我写得还有一个问题, 就是如果这个词被分开两行就不行了. 这个要分开处理一下, 要多很多步的.

你可以做一个重定向,我只不过是给出sed替换的一种语法
作者: q1208c    时间: 2005-11-21 18:20
原帖由 bingosek 于 2005-11-21 18:13 发表

你可以做一个重定向,我只不过是给出sed替换的一种语法


作者: platinum    时间: 2005-11-21 20:16
给你个例子好了
将当前目录下所有包含 abc 的文件中的 abc 替换成 xyz(包括搜索子目录)

  1. # sed -i 's/abc/xyz/g' `grep -rl "abc" .`
复制代码

作者: phpman    时间: 2005-11-21 20:24
sed -i   ?
-i 是什么意思啊?
作者: kartwall    时间: 2005-11-21 21:52
-i 就可以不用将sed的结果重定向然后再覆盖回原来的文件,sed会直接修改原来的文件
可以看看sed的manual

这个问题其实很简单,可以这样写命令:

cat *.jsp | sed -i "s/aaa/bbb/g"
作者: kelela    时间: 2005-11-21 21:58
vi可以
命令模式下
1,$ s/原来的字段/要改的字段/g
作者: 零二年的夏天    时间: 2005-11-21 22:03

  1. for jspfile in $(echo *)
  2. do
  3. sed -i 's/abc/xyz/g' $jspfile
  4. done
复制代码

作者: nimoncoffee    时间: 2005-11-22 10:01
我用sed -e 's/abc/xyz/g'  *.jsp确实替换了我想要替换的字段,他显示出来所有的jsp文件的内容,
但是原来文件的内容还是原来的样子,请问怎么来覆盖原来的所有jsp文件?
我还是个初学者,请大家多多指教,谢谢!
作者: 采风    时间: 2005-11-22 10:54
原帖由 kartwall 于 2005-11-21 21:52 发表
-i 就可以不用将sed的结果重定向然后再覆盖回原来的文件,sed会直接修改原来的文件
可以看看sed的manual

这个问题其实很简单,可以这样写命令:

cat *.jsp | sed -i "s/aaa/bbb/g"


cat *.jsp这样不行吧?
作者: nimoncoffee    时间: 2005-11-22 11:32
cat *.jsp | sed -e 's/aaa/bbb/g'的效果跟sed -e 's/abc/xyz/g'  *.jsp得出的结果是一样的
作者: bingosek    时间: 2005-11-22 11:41
原帖由 采风 于 2005-11-22 10:54 发表


cat *.jsp这样不行吧?

肯定不行
作者: shtang    时间: 2005-11-22 12:25
perl -pi -e 's/aaa/bbb/g' *.jsp
作者: nimoncoffee    时间: 2005-11-22 15:24
原帖由 shtang 于 2005-11-22 12:25 发表
perl -pi -e 's/aaa/bbb/g' *.jsp



谢谢,省了我不少时间,这个方法不错。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2