bash – 如何在查找表达式中使用带有sed的文件名

前端之家收集整理的这篇文章主要介绍了bash – 如何在查找表达式中使用带有sed的文件名前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
试图回答 Using Bash/Perl to modify files based on each file’s name我结束了一个我不知道如何使用find和sed all的点.

假设存在某种文件结构,我们想要更改一行,附加文件名.

如果它是循环的正常,我们会这样做:

for file in dir/*
do
   sed -i "s/text/text plus $file/g" $file
done

但是,假设我们想使用find来更改所有子目录中的文件.在这种情况下,我会用…

find . -type f -exec sed -i "s/text/text plus {}/g" {} \;
                                              ^
                                   it does not like this part

但是sed中的这些{}不被接受,我得到了错误

sed: -e expression #1,char 20: unknown option to `s’

我发现了一些类似的问题(1),但在这种情况下,我无法概括它以使其对我来说是可以理解的.

我相信你们会为此提供一个很好的解决方案.谢谢!

find将返回路径名(相对或绝对),具体取决于您指定的路径.

这会与你指定的分隔符冲突,即/.更改sed的分隔符,你应该是好的:

find . -type f -exec sed -i "s|text|text plus {}|g" {} \;

编辑:要从路径中删除前导./,您可以尝试:

find . -type f -exec sh -c '$f={}; f=${f/.\//}; sed -i "s|text|text plus ${f}|g" {}' \;

我确信可能存在更好的解决方案……

猜你在找的Bash相关文章