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コマンドの構文をシェルの組み込み構文と混同することです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

関連情報