複数の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