需要在linux终端中使用sed编辑多个文件的帮助吗

需要在linux终端中使用sed编辑多个文件的帮助吗,linux,bash,command-line,sed,terminal,Linux,Bash,Command Line,Sed,Terminal,我想在这里做一个简单的操作。也就是从一个文件样式中剪切几个字符。css在另一个文件client_custom.css上查找替换,以替换100多个不同名称的目录 当我使用以下命令时 for d in */; do sed -n 73p ~/assets/*/style.css | cut -c 29-35 | xargs -I :hex: sed -i 's/!BGCOLOR!/:hex:/' ~/assets/*/client_custom.css $d; done 它一直给我以下所有目录

我想在这里做一个简单的操作。也就是从一个文件样式中剪切几个字符。css在另一个文件client_custom.css上查找替换,以替换100多个不同名称的目录

当我使用以下命令时

for d in */; do sed -n 73p ~/assets/*/style.css | cut -c  29-35 | xargs -I :hex:  sed -i 's/!BGCOLOR!/:hex:/' ~/assets/*/client_custom.css $d; done
它一直给我以下所有目录的错误

sed: couldn't edit dirname/: not a regular file
我不明白为什么它给我的错误消息明确给出了文件的完整路径。它在没有for循环的情况下工作得非常好

有人能帮我解决这个问题吗?

sed不支持文件夹作为输入

for d in */;
将文件夹放入$d。如果你写sed$d、 然后BASH将把文件夹名放入sed的参数中,这个糟糕的工具将被混淆

另外~/assets/*/client_custom.css,因为这将扩展到与此模式匹配的所有文件。因此,sed将使用所有文件名调用一次。您可能希望每个文件名调用一次sed

试一试

或者,更好的是:

for f in ~/assets/*/client_custom.css; do
    ... | sed 's/!BGCOLOR!/:hex:/' "${f}.in" > "${f}"
done
这不会覆盖输出文件。通过这种方式,您可以将*.in保存在文件中,使用模式编辑它们,然后使用sed扩展所有变量

for f in ~/assets/*/client_custom.css; do
    ... | sed 's/!BGCOLOR!/:hex:/' "${f}.in" > "${f}"
done