SO 上有很多类似的帖子。但是,那里给出的答案对我不起作用。我使用的是 Mac OS Monterey 版本 12.6.5。
我正在使用
grep
搜索包含模式或文本部分的目录中的所有文件。然后我想通过管道传输该文件名并使用 perl -pe
或 sed
以及内联选项 -i
。但是,它在我的 Mac 上不起作用!下面给出了最小代码。
newprojectname=NEW
oldprojectname=OLD
dir=.
grep $oldprojectname $dir -lr --exclude test.sh
grep $oldprojectname $dir -lr --exclude test.sh | xargs perl -i -pe's/oldprojectname/$newprojectname/g'
# Also tried
grep $oldprojectname $dir -lr --exclude test.sh | xargs sed -i.'' 's/oldprojectname/$newprojectname/g'
echo `sw_vers`
cat t1.txt t2.txt
输出:
./.test.sh.swp
./t1.txt
./t2.txt
sed: RE error: illegal byte sequence
ProductName: macOS ProductVersion: 12.6.5 BuildVersion: 21G531
OLD
OLD
您可以看到
grep
操作成功找到了两个包含搜索到的模式OLD
的文件。但是,OLD
尚未被 NEW
取代。这就是这里的问题。
我有意保留无意生成的 .swp 文件,以便答案也能处理二进制文件。
可以通过对我的脚本进行简单修改来解决这个问题吗?
您的脚本的问题是您忘记了 $oldprojectname 上的
$
。
... | xargs perl -i -pe's/oldprojectname/$newprojectname/g'
^
there
不需要 grep 来查找包含旧文本的文件,它是多余的。您可以一次性搜索并替换每个文件。使用
find
向 Perl 提供文件。
find . -type f \! -name 'test.sh' -print0 | xargs -0 perl -i -pe 's/$old/$new/g'