在我当前目录下的所有文件中用另一个字符串替换字符串

时间:2011-09-16 20:57:29

标签: string bash sed

如何用当前目录下的另一个字符串替换每个字符串?

示例:我想在当前目录下的每个文件中用www.fubar.com替换每次出现的www.fubar.ftw.com

到目前为止,我已经提出了研究

sed -i 's/www.fubar.com/www.fubar.ftw.com/g' *.php

5 个答案:

答案 0 :(得分:55)

您走在正确的轨道上,使用find找到文件,然后sed进行编辑,例如:

find . -name '*.php' -exec sed -i -e 's/www.fubar.com/www.fubar.ftw.com/g' {} \;

注释

  • .表示当前目录 - 即在这种情况下,搜索当前目录及其下方。
  • 对于sed的某些版本,您需要为-i选项指定扩展名,该选项用于备份文件。
  • -exec选项之后是要应用于找到的文件的命令,并由分号终止,必须对其进行转义,否则shell会在传递给find之前使用它。

答案 1 :(得分:2)

使用find,args和sed的解决方案:

find . -name '*.php' -print0 | xargs -0 sed -i 's/www.fubar.com/www.fubar.ftw.com/g'

答案 2 :(得分:1)

如果没有子文件夹,更简单的方法是

replace "www.fubar.com" "www.fubar.ftw.com" -- *

其中*也可以是文件列表

来自手册:

  

以下列方式之一调用替换:

       shell> replace from to [from to] ... -- file_name [file_name] ...
       shell> replace from to [from to] ... < file_name

如果您有带点的隐藏文件,可以使用

将这些文件添加到*
shopt -s dotglob

如果您只有一个子文件夹深度,则可以使用*/*代替*

replace "www.fubar.com" "www.fubar.ftw.com" -- */*

答案 3 :(得分:0)

纯粹的bash解决方案

#!/bin/bash
shopt -s nullglob
for file in *.php
do
    while read -r line
    do
       echo "${line/www.fubar.com/www.fubar.ftw.com}"
    done < "$file" > tempo && mv tempo "$file"

done

答案 4 :(得分:0)

使用 ZSH 作为外壳程序时,您可以执行以下操作:

sed -i 's/www.fubar.com/www.fubar.ftw.com/g' **/*.php