如何用当前目录下的另一个字符串替换每个字符串?
示例:我想在当前目录下的每个文件中用www.fubar.com
替换每次出现的www.fubar.ftw.com
。
到目前为止,我已经提出了研究
sed -i 's/www.fubar.com/www.fubar.ftw.com/g' *.php
答案 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