将属性值替换为 SVG 中的另一个值

将属性值替换为 SVG 中的另一个值

我有一个包含多个 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

相关内容