我想在这里做一个简单的操作。这是从一个文件(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
,它完全正常。
任何人都可以帮我解决这个问题吗?
答案 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
来"展开"所有变量。