在 Mac OS 中使用“grep”进行模式搜索然后替换的问题

问题描述 投票:0回答:1

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 文件,以便答案也能处理二进制文件。

可以通过对我的脚本进行简单修改来解决这个问题吗?

shell perl sed grep zsh
1个回答
0
投票

您的脚本的问题是您忘记了 $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'
© www.soinside.com 2019 - 2024. All rights reserved.