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

관련 정보