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

时间:2013-07-22 13:32:14

标签: bash sed find exec

尝试回答Using Bash/Perl to modify files based on each file's name我的结论是,我不知道如何一起使用findsed

我们说有一些文件结构,我们想要更改一行,附加文件名。

如果这是一个正常的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),但在这种情况下,我无法将其概括为足以让我理解。

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

2 个答案:

答案 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" {}' \;

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