width
첫 번째 파일에 추가하려는 디렉토리에 여러 개의 파일이 있습니다 >
. 각 파일에는 서로 다른 width
값이 있습니다.
파일에는 다음이 포함됩니다.
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="512px"
height="512px"><path //removed for brevity
다른 파일에는 다음이 있습니다.
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="415px"
height="450px"><path //removed for brevity
등.
나는 그것들을 다음으로 바꾸고 싶습니다 :
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="{size}"
height="{size}" viewBox="0 0 512 512" fill={color}
class={$$props.class} {...$$restProps} aria-label={ariaLabel}><path
//removed for brevity
다음을 시도했지만 작동하지 않습니다.
sed -i 's/width.*>/width={size} height={size} viewBox="0 0 512 512"
fill={color}
class={$$props.class} {...$$restProps} aria-label={ariaLabel}/' ./*.*
답변1
-i
sed
차용 구현을 위한 일부(전부는 아님) 옵션이 있습니다 perl
. perl
여기서는 더 쉬워집니다.
perl -0777 -pi -e 's{\bwidth=".*?>}{width="{size}"
height="{size}" viewBox="0 0 512 512" fill={color}
class={\$\$props.class} {...\$\$restProps} aria-label={ariaLabel}>}gs' yourfile
어디:
-0777
한 번에 한 줄이 아닌 전체 파일을 처리합니다.s{...}{...}
는 또 다른 작성 방법 이지만 패턴이나 대체 문자s/.../.../
에 대해 걱정할 필요가 없습니다 . , 일치하는 한./
{
}
*?
예, 탐욕스럽지 않은 버전입니다*
.\b
width="
는 단어 경계이므로minwidth="
예를 들어 일치하지 않습니다. 하지만 여전히 일치합니다min-width="
. 이것이 문제라면(?<=\s)
(를 나타내는앞에 공간만 있으면).- 이 플래그는 필요한 경우
s
여러 줄에 걸쳐 있을 수 있습니다 (그리고 개행과 일치할 수도 있습니다). 첫 번째 항목만 바꾸려면 이 플래그를 제거하세요..*
.
g
태그 에서만 <svg>
이 작업을 수행하세요 .
perl -0777 -pi -e 's{<svg[^<>]*\bwidth="\K.*?>}{{size}"
height="{size}" viewBox="0 0 512 512" fill={color}
class={\$\$props.class} {...\$\$restProps} aria-label={ariaLabel}>}gs' yourfile
답변2
형식이 개행을 허용하는 동안 문제는 sed
한 줄씩 작동 할 수 있습니다 svg
. 여기서는 그럴 것 같습니다. 따라서 width
뒤에 a가 오는 행이 없으므로 >
대체가 없습니다.
그러나 path
요소가 같은 행에 있을 수 있으므로 상황 이 더 나쁠 수도 있습니다 .*
.
width
및 각각 다음을 교체하는 것이 좋습니다 height
.
sed 's/width="[^"]*/width="{size}/;s/height[^"]*"/height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel} /' ./*.*
- 이 옵션을 제거했습니다
-i
. 테스트하기 전에 다시 추가하지 마세요. [^"]*
가 아닌 모든 문자와 일치하므로"
예상보다 많은 문자를 제거하는 것을 방지합니다.- 의도적인 것인지 알 수 없기 때문에 코드에서 줄 바꿈을 제거했습니다. 대체의 실제 개행 문자 앞에는 백슬래시가 와야 합니다.
답변3
사용 sed
.
$ sed -i.bak s'~\(width="\)[^>]*~\1{size}" height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel}~' input_file
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="{size}" height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel}><path //removed for brevity