여러 개의 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