我如何查找并替换每次出现的:
subdomainA.example.com
具有
subdomainB.example.com
递归地在/home/www/目录树下的每个文本文件中?
我如何查找并替换每次出现的:
subdomainA.example.com
具有
subdomainB.example.com
递归地在/home/www/目录树下的每个文本文件中?
当前回答
我很惊讶我没有看到使用文件globbing的简单答案,我只使用**/package.json扫描/更新package.json文件
这是zsh下macos特有的
cd /home/www
sed -i '' -e 's/subdomainA.example.com/subdomainA.example.com/g' **/*
其他回答
这是我为OSX和Windows(msys2)找到的最好的全方位解决方案。应该可以使用任何可以获得gnu版本sed的东西。跳过.git目录,这样不会损坏您的校验和。
在mac上,只需先安装coreutils并确保gsed在路径中-
brew install coreutils
然后我将此函数粘贴到zshrc/bashrc->
replace-recursive() {
hash gsed 2>/dev/null && local SED_CMD="gsed" || SED_CMD="sed"
find . -type f -name "*.*" -not -path "*/.git/*" -print0 | xargs -0 $SED_CMD -i "s/$1/$2/g"
}
usage: replace-recursive <find> <replace>
使用grep和sed的组合
for pp in $(grep -Rl looking_for_string)
do
sed -i 's/looking_for_string/something_other/g' "${pp}"
done
所有的技巧都差不多,但我喜欢这个:
find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} +
find<mydir>:在目录中查找。-类型f:文件类型:常规文件-exec命令{}+:-exec操作的这个变体在选定的文件上运行指定的命令,但命令行是通过附加结尾处的每个选定文件名;命令的调用总数将大大少于匹配的文件。命令行的构建方式与xargs构建命令行的方式大致相同。只有一个实例`命令中允许使用“{}”。该命令在起始目录中执行。
更简单的方法是在命令行上使用以下命令
find /home/www/ -type f|xargs perl -pi -e 's/subdomainA\.example\.com/subdomainB.example.com/g'
对于任何使用银搜索器(ag)的人
ag SearchString -l0 | xargs -0 sed -i 's/SearchString/Replacement/g'
由于ag默认忽略git/hg/svn文件/文件夹,因此在存储库中运行是安全的。