查找并替换多个文件中的文本

时间:2011-04-05 10:24:42

标签: regex replace sed grep xargs

我将一个typo3网站(LAMP)从knopix服务器迁移到ubuntu 10.04计算机。现在一半的网站有点工作,另一个没有。我想我发现了问题,但无法解决它,因为我不够数学,所以我可以做好正则表达式的东西。

在新服务器上,文件位于“/ var / www / cms” 旧服务器将它们放在/media/sda3/www/quickstart-4.2.1 /

我认为如果包含sub-dirs的“/ var / www / cms”中包含“/media/sda1/www/quickstart-4.2.1/”字符串的所有文件都要替换为“/” var / www / cms“该网站将正常运作。

这个unix newbe非常感谢帮助。 提前谢谢!

2 个答案:

答案 0 :(得分:0)

看起来你不需要正则表达式。
这是一个普通的字符串搜索/替换,您可以使用任何文本编辑器。许多文本编辑器也不仅可以搜索/替换一个打开的文件,还可以搜索一个空洞目录。我经常使用jEdit

另外,不要直接在服务器上编辑文件,而是使用本地副本并在文件修复后传输这些文件应该会容易得多。

答案 1 :(得分:0)

查找基于管道的是您的朋友。这个答案假定基于Linux / Unix的操作系统。

我强烈建议您只需剪切每个命令,一次一个,粘贴到命令行 在您有更多经验之前,不要尝试将其转换为shell脚本。 确保你理解每个步骤正在做什么,并三重检查结果是否真的是它们应该是什么,而不仅仅是你想要它或者假设它应该是; - !)

# goto the root of your new filesystem
cd /var/www/cms

# print out the filenames with the old path in it
find . -print | xargs grep -l "/media/sda1/www/quickstart-4.2.1/" 
# find . -print all fileNames
              # take output from find (via pipe)
                # xargs manages creation of command line with filenames from pipe
                     # grep -l saarchs for target string and prints only file names

# make sure there are no files in this list that shouldn't be modified.

# backup files in list
find . -print | xargs -I {} /bin/cp {} {}.sav_20110405
# note that the sav_20110405 is date composed by YYYYMMDD.
# A good habit to get into

# run a test on one file from list above
 testFile=/var/www/cms/yourFileNameHere.html

find . -print -name ${testFile} \
| grep -v 'sav_20110405$' \
| while read fName ; do 
     ex - ${fName} <<EOS
     :%s/\/media\/sda1\/www\/quickstart-4.2.1/\/var\/www\/cms/g
     :wq
EOS

done

这很好,因为使用sed解决方案,您必须管理修复程序重定向到新文件,然后将固定文件重命名为原始文件。

ex编辑器就像vi编辑器,但是用于指令的批量输入,并且好处是你可以发出'write'命令和'q'退出。

重要 某些shell和/或ex命令在这种构造中存在问题。这就是我们为什么要测试备份的一个文件的原因。在继续操作之前,请确保文件正常并且备份文件已就位。

# inspect the 'fixed file' and be *really* sure there it is correct
# also be sure the ${testFile}.sav_20110405 did NOT get modified.

# run command for all files
find . -print  \
| grep -v 'sav_20110405$' \
| while read fName ; do 
     ex - ${fName} <<EOS
     :%s/\/media\/sda1\/www\/quickstart-4.2.1/\/var\/www\/cms/
     :wq
EOS

done

在您的待办事项列表中记下1个月后,返回并删除sav文件。

find . -print -name '*.sav_20110405'

选择文件名

find . -print -name 'myTestFile.sav_20110405' | xargs /bin/rm

确保这是唯一删除的文件。

现在清理其余文件

find . -print -name '*.sav_20110405' | xargs /bin/rm

祝你好运并三重检查一切; - )!。

我希望这会有所帮助。

P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。