我正在尝试使用 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 在带引号的字符串中执行变量扩展。