我有一个包含多个 SVG 文件的目录。我想做的是将height="2500"
(高度值可以是任何整数)替换为height="{{ include.height }}"
.谁能告诉我我做错了什么?
<svg xmlns="http://www.w3.org/2000/svg" width="2232" height="2500" viewBox="32.163 68.509 203.691 228.155"><path d="M101.885 207.092c7.865 0 14.241 6.376 14.241 14.241v61.09c0 7.865-6.376 14.24-14.241 14.24-7.864 0-14.24-6.375-14.24-14.24v-61.09c0-7.864 6.376-14.24 14.24-14.24z" fill="#a4c639"/></svg>
find_string="height=\"\d+\""
replace_string="height=\"{{ include.height }}\""
for i in . -type f -name "*.svg");
do
if grep -q "${find_string}" $i
then
sed -i -r "s/${find_string}/${replace_string}/" $i
fi
done
答案1
您做错的第一件事是您将命令的语法find
与 shell 内置的语法混淆了for
:
for i in . -type f -name "*.svg");
那没有任何意义。你可以这样做:
for i in *.svg
或这个:
find . -type f -name "*.svg"
但你不能像以前那样将它们组合起来。那里还有一个尾括号,但我们忽略它。
接下来,您将使用不必要的grep
.您正在使用 处理所有文件grep
,然后使用 再次处理其中一些文件sed
。这并不会提高任何效率,如果您无论如何都要读取该文件,您也可以在需要的地方进行替换。
最后,你可以使用单引号,这样你就不需要转义双引号,并且sed
不明白\d
,所以使用[0-9]
代替。
所以,这应该做你想做的如果文件都在同一目录中:
find_string='height="[0-9]+"'
replace_string='height="{{ include.height }}"'
for i in *.svg;
do
sed -i -E "s/${find_string}/${replace_string}/" "$i"
done
如果需要递归到子目录,可以使用find
。如果您 100% 确定您的文件名没有空格、换行符或其他空格,您可以简单地执行以下操作:
find_string='height="[0-9]+"'
replace_string='height="{{ include.height }}"'
find . -type f -name '*.svg' | while read i; do
sed -i -E "s/${find_string}/${replace_string}/" "$i"
done
或者,要处理任意文件名,假设您有 GNU find
,请使用:
find_string='height="[0-9]+"'
replace_string='height="{{ include.height }}"'
find . -type f -name '*.svg' -print0 | while IFS= read -r -d '' i; do
sed -i -E "s/${find_string}/${replace_string}/" "$i"
done
或者,如果您正在使用bash
,您可以执行以下操作:
shopt -s globstar
find_string='height="[0-9]+"'
replace_string='height="{{ include.height }}"'
for i in **/*.svg;
do
sed -i -E "s/${find_string}/${replace_string}/" "$i"
done