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

时间:2014-11-17 14:15:23

标签: linux bash command-line sed terminal

我想在这里做一个简单的操作。这是从一个文件(style.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 loop,它完全正常。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

sed不支持文件夹作为输入。

for d in */;

将文件夹放入$d。如果您编写sed ... $d,那么BASH会将文件夹名称放入sed的参数中,而糟糕的工具将会混淆。

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

尝试

for f in ~/assets/*/client_custom.css; do
    ... | sed -i 's/!BGCOLOR!/:hex:/' $f
done

或者,甚至更好:

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

(它不会覆盖输出文件)。通过这种方式,您可以将" *。保留在"文件,使用模式编辑它们,然后使用sed来"展开"所有变量。