2

试图回答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 表达式 #1, char 20: `s' 的未知选项

我发现了一些类似的问题(1),但在这种情况下无法将其概括到足以让我理解的程度。

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

4

2 回答 2

6

我真的认为问题在于您的文件名包含 a/这就是 sed 认为它启动选项字符串的原因。

在您的 sed 命令中替换/为可以完成这项工作。@

我在 Linux BASH 上尝试过,它运行良好

find . -type f -exec sed -i -e "s@text@test plus {}@g" {} \;
于 2013-07-22T13:43:33.557 回答
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" {}' \;

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

于 2013-07-22T13:44:21.093 回答