我如何查找并替换每次出现的:
subdomainA.example.com
具有
subdomainB.example.com
递归地在/home/www/目录树下的每个文本文件中?
我如何查找并替换每次出现的:
subdomainA.example.com
具有
subdomainB.example.com
递归地在/home/www/目录树下的每个文本文件中?
当前回答
最简单的替换方式(所有文件、目录、递归)
find . -type f -not -path '*/\.*' -exec sed -i 's/foo/bar/g' {} +
注意:有时您可能需要忽略一些隐藏文件,例如.git,您可以使用上面的命令。
如果要包含隐藏文件,请使用,
find . -type f -exec sed -i 's/foo/bar/g' {} +
在这两种情况下,字符串foo将被替换为新的字符串栏
其他回答
这一个与git存储库兼容,而且更简单:
Linux:
git grep -l 'original_text' | xargs sed -i 's/original_text/new_text/g'
Mac:
git grep -l 'original_text' | xargs sed -i '' -e 's/original_text/new_text/g'
(感谢http://blog.jasonmeridth.com/posts/use-git-grep-to-replace-strings-in-files-in-your-git-repository/)
#!/usr/local/bin/bash -x
find * /home/www -type f | while read files
do
sedtest=$(sed -n '/^/,/$/p' "${files}" | sed -n '/subdomainA/p')
if [ "${sedtest}" ]
then
sed s'/subdomainA/subdomainB/'g "${files}" > "${files}".tmp
mv "${files}".tmp "${files}"
fi
done
grep-lr'submainA.example.com'|读取文件时;do sed-i“s/submainA.example.com/submainB.example.com/g”“$file”;完成
我想大多数人都不知道他们可以将某些内容导入“while read file”,这样可以避免那些讨厌的-print0参数,同时在文件名中预设空格。
在sed之前进一步添加一个echo,可以让您在实际执行之前查看哪些文件将发生更改。
用更简单的fd(1)/fdfind=替换find(1)https://github.com/sharkdp/fd:
fdfind . --type f --exec sed -i "s/original_string/new_string/g"
寻址fd(1)iconsistent pkg和cmd名称
在macOS自制软件上:pkg和cmd=fd在Ubuntu 20.04上:pkg=fd find,cmd=fdfind
我在macOS上创建了一个别名fdfind='fd',以实现一致的cmd命名(在我的macOS和Linux平台之间)。
有关这一点的更多信息,请访问https://github.com/sharkdp/fd/issues/1009.
更多细节和附加功能
# bash examples:
1='original_string'
2='new______string'
# for this (the original-poster's) question:
1='subdomainA.example.com'
2='subdomainB.example.com'
# 'fdfind' (on at least Ubuntu 20.04) = 'fd' = https://github.com/sharkdp/fd
fdfind . --type f --exec sed -i "s/$1/$2/g"
# Here's a slightly-more-complex example that
# a. excludes (-E) .git/ and archive/ dirs, and
# b. performs a word-boundary search on the original_string (\<$1\>):
fdfind . -E .git/ -E archive/ --type f --exec sed -i "s/\<$1\>/$2/g"
甚至更高级:从第三个($3)命令行参数控制单词边界(第三个参数=noword表示无边界,leftword表示仅左侧单词边界,rightword表示仅右侧边界):
#!/usr/bin/env bash
#
# replace-tree.bash
#
# 'fdfind' (on at least Ubuntu 20.04) = 'fd' = https://github.com/sharkdp/fd
if [ $# -lt 2 ]; then
echo "$0: Please provide at least 2 arguments."
exit 1
fi
original="\<$1\>"
if [ "$3" = "noword" ]; then
original="$1"
elif [ "$3" = "leftword" ]; then
original="\<$1"
elif [ "$3" = "rightword" ]; then
original="$1\>"
fi
fdfind . --type f --exec sed -i "s/$original/$2/g"
示例用法:
$ replace-tree.bash original_string new_string leftword
$
试试看:
sed -i 's/subdomainA/subdomainB/g' `grep -ril 'subdomainA' *`