![在 shell 脚本中对具有特定扩展名的文件使用 sed](https://linux22.com/image/81798/%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%AF%B9%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%E4%BD%BF%E7%94%A8%20sed.png)
我正在尝试使用 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 在带引号的字符串中执行变量扩展。