尝试回答Using Bash/Perl to modify files based on each file's name我的结论是,我不知道如何一起使用find
和sed
。
我们说有一些文件结构,我们想要更改一行,附加文件名。
如果这是一个正常的for
循环,我们会这样做:
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:`s'
的未知选项
我发现了一些类似的问题(1),但在这种情况下,我无法将其概括为足以让我理解。
我相信你们会为此提供一个很好的解决方案。谢谢!
答案 0 :(得分:6)
我真的认为问题是您的文件名包含/
,这就是为什么sed认为它会启动选项字符串。
在你的sed命令中用/
替换@
就可以了。
我在Linux BASH上尝试过,它运行良好
find . -type f -exec sed -i -e "s@text@test plus {}@g" {} \;
答案 1 :(得分:4)
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" {}' \;
我确信可能存在更好的解决方案......