【问题标题】:Find and replace texts in multiple files查找和替换多个文件中的文本
【发布时间】:2011-07-29 20:29:47
【问题描述】:

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

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

我认为如果“/var/www/cms”中的所有文件(包括子目录)包含“/media/sda1/www/quickstart-4.2.1/”字符串,都将替换为“/ var/www/cms" 网站将正常运行。

此 unix 新手将非常感谢您的帮助。 提前致谢!

B

【问题讨论】:

    标签: regex replace sed grep xargs


    【解决方案1】:

    基于查找的管道是您的朋友。此答案假定基于 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
    

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

    我希望这会有所帮助。

    附:由于您似乎是新用户,如果您得到对您有帮助的答案,请记住将其标记为已接受,和/或给它一个 +(或 -)作为有用的答案。

    【讨论】:

      【解决方案2】:

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

      此外,不直接在服务器上编辑文件,而是使用本地副本并在文件修复后传输文件应该更容易。

      【讨论】:

        猜你喜欢
        • 2013-01-29
        • 2014-08-22
        • 2013-12-26
        • 2014-01-14
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        相关资源
        最近更新 更多