在 shell 脚本中对具有特定扩展名的文件使用 sed

在 shell 脚本中对具有特定扩展名的文件使用 sed

我正在尝试使用 sed 查找具有特定扩展名的文件,然后将出现的某个字符串替换为另一个字符串。

No directory mentioned using current directory
*.h
sed: can't read *.h: No such file or directory
*.C
sed: can't read *.C: No such file or directory
*.cc
sed: can't read *.cc: No such file or directory
un.cpp

这是我的脚本中的代码:

for file in *.{h,C,cc,cpp}
       do
          echo $file;
          sed -i -e 's/${1}/${2}/g' $file;
       done

当我尝试使用 find 递归地在子文件夹上使用 sed 时,我遇到了类似的问题:

find ./*.{h,C,cc,cpp} -type f -exec sed -i -e 's/${2}/${3}/g' {} \;

谢谢

答案1

find . -type f -a \( -name "*.h" -o -name "*.C" -o -name "*.cc" -o -name "*.cpp" \) -a -exec sed -i -e "s/${2}/${3}/g" {} +

应该管用。

在您的第一个脚本中,问题是,如果没有匹配 eg *.h, bash 会将文字传递*.h给 sed ,然后 sed 会认为这是一个文件名,但由于不存在这样的文件,因此它将失败。

在第二种情况下,使用find(1),您让 shell 在当前目录中查找匹配的文件名,然后将它们传递给 find(1)。

在 sed 语句中,您需要双引号而不是单引号,以便 shell 在带引号的字符串中执行变量扩展。

相关内容